Как сделать асинхронность в NodeJs - PullRequest
0 голосов
/ 17 апреля 2019

В моей асинхронной функции я не могу получить вывод с истинным приоритетом.

Ожидаемый результат - сначала {control : 1}, а затем {control : 2}.

Но результат наоборот.

Как мне это сделать?

Код NodeJS

edit_settings = async function (params) {

    await User.updateOne({ _id: params.id }, query, (error, update_result) => {
        console.log({ control : 1 });
        if (error) return { success: false, error: { code: 1001 } };
        else return { success: update_result.nModified };
    });

    return await { control : 2 };
}

NodeJS Результат

{ control : 2 }
{ control : 1 }

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Это не похоже на User.updateOne возвращает обещание (может быть ошибочным, но я предполагаю, что это не так), оно принимает обратный вызов, поэтому await - если оно ничего не сделает.

РЕДАКТИРОВАТЬ: Один из способов решить эту проблему - создать обещание, подобное этому:

edit_settings = async function (params) {
    let res; // the `resolve` method of a promise
    const p = new Promise(r => res = r);
    User.updateOne({ _id: params.id }, query, (error, update_result) => {
        console.log({ control : 1 });
        res(); // resolve the promise
        if (error) return { success: false, error: { code: 1001 } };
        else return { success: update_result.nModified };
    });

    await p;
    return { control: 2 };
}

РЕДАКТИРОВАТЬ: Исходя из вашего комментария, что User.updateOne на самом деле возвращает обещание, тогда вы должны использовать его какthis:

edit_settings = async function (params) {

    await User.updateOne({ _id: params.id }, query);
    console.log({control:1});
    return { control : 2 };
}

Из кода, который вы показали, вы фактически ничего не делаете со значением, возвращаемым из обещания, поэтому я удалил его из вашего кода.

0 голосов
/ 17 апреля 2019

Я нашел решение:

edit_settings = async function (params) {

    let result;

    ..

    result = await User.updateOne({ _id: params.id }, query).then(update_result => {
        result = { success: update_result.nModified };
    });

    ..

    return await result ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...