Большой! Спасибо, все работает правильно!

я есть приложение узла, которое использует некоторые асинхронные функции.

Как я могу сделать для ожидания завершения асинхронной функции, прежде чем продолжить с остальной частью потока приложения?

Ниже приведен простой пример.

var a = 0;
var b = 1;
a = a + b;

// this async function requires at least 30 sec
myAsyncFunction({}, function(data, err) {
    a = 5;
});

// TODO wait for async function

console.log(a); // it must be 5 and not 1
return a;

В примере элемент "a"для возврата должно быть 5, а не 1. Оно равно 1, если приложение не ожидает асинхронную функцию.

Спасибо

 Bergi07 нояб. 2017 г., 14:29
Да, обещания иasync/await Синтаксис Sugar - как вы предложили в тегах - это путь. Вы пытались применить их к вашей проблеме? Пожалуйста, покажите свои усилия.
 user252096907 нояб. 2017 г., 14:22
Отличный и полезный комментарий
 Dave Newton07 нояб. 2017 г., 14:19
Вы используете обещания и учитесь писать асинхронный код? Попытка сделать асинхронный код похожим на неасинхронный код почти всегда заканчивается страданием.
 Kevin B07 нояб. 2017 г., 20:37

Ответы на вопрос(1)

Решение Вопроса
Используя механизм обратного вызова:
function operation(callback) {

    var a = 0;
    var b = 1;
    a = a + b;
    a = 5;

    // may be a heavy db call or http request?
    // do not return any data, use callback mechanism
    callback(a)
}

operation(function(a /* a is passed using callback */) {
    console.log(a); // a is 5
})
Использование асинхронного ожидания
async function operation() {
    return new Promise(function(resolve, reject) {
        var a = 0;
        var b = 1;
        a = a + b;
        a = 5;

        // may be a heavy db call or http request?
        resolve(a) // successfully fill promise
    })
}

async function app() {
    var a = await operation() // a is 5
}

app()
 user252096907 нояб. 2017 г., 14:50
Большой! Спасибо, все работает правильно!

Ваш ответ на вопрос