Метеор: работа с асинхронными методами
Я использую React с Meteor. У меня есть метод внутри компонента React, который вызывает Meteor.method (который также запускается на клиенте):
// index.js
loginWithGoogle() {
console.log('1')
Meteor.call('auth.loginWithGoogle', {}, (err, res)=>{
console.log('5');
if (err) {
console.log(err) // line 16:
} else {
console.log('success');
// console.log(res);
// console.log('logged in with google callback in react yay:)')
}
});
}
В клиентской части Meteor у меня есть метод:
// auth.js
Meteor.methods({
async 'auth.loginWithGoogle'(){
console.log('2')
let err = await Meteor.loginWithGoogle()
console.log('3');
console.log(err)
if (err) {
console.log('-1')
throw new Error(err);
}
console.log('4');
// Meteor.loginWithGoogle({
// // options
// }, (err) => {
// console.log('3')
// if (err) {
// console.log(err)
// throw new Meteor.Error(err)
// } else {
// console.log('4')
// // successful login!
// }
// });
}
});
Здесь закомментированный код - старый подход. Обратите внимание, у меня есть вызовы console.log с номерами, цифры указывают порядок, в котором я ожидаю выполнения кода. Старый метод не работает вообще, console.log('5') выполняется раньше, чем (3 и 4), из-за асинхронного выполнения. Перезапись с помощью async /await дает следующее:
index.js:12 1
auth.js:4 2
auth.js:6 3
auth.js:7 undefined
auth.js:12 4
index.js:14 5
index.js:16 errorClass {isClientSafe: true, error: 404, reason: "Method 'auth.loginWithGoogle' not found", details: undefined, message: "Method 'auth.loginWithGoogle' not found [404]", …}
Итак, из журналов я вижу, что код выполняется так, как я ожидал. Внутри auth.js:7 у меня err == undefined, но внутри index.js (ответная часть) это errorClass.
Как мы имеем дело с асинхронным кодом в метеорных методах?
1 ответ
Я понял. Почему я использовал Meteor.methods на клиенте? Я мог бы просто использовать функцию JavaScript следующим образом:
const loginWithGoogle = async () => {
console.log('2')
let err = await Meteor.loginWithGoogle()
console.log('3');
console.log(err)
if (err) {
console.log('-1')
throw new Error(err);
}
console.log('4');
}
export {
loginWithGoogle
}
Я просто использую асинхронную функцию, она возвращает Promise.
Внутри React я тоже использую асинхронный синтаксис:
async loginWithGoogle() {
let err = await loginWithGoogle()
if (err){
console.log(err)
}else {
console.log('success')
}
}