Метеор: работа с асинхронными методами

Я использую 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!
        //     }
        // });
    }
});
Примечание. Meteor.loginWithGoogle предоставляется пакетом account-google. При тестировании я смог перейти на страницу входа в Google, войти и перенаправить обратно в свое приложение), а затем распечатать журналы.

Здесь закомментированный код - старый подход. Обратите внимание, у меня есть вызовы 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')
        }

    }

Другие вопросы по тегам