Как заставить асинхронный вызов один за другим с помощью async / await? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть две простые асинхронные функции: Первая:

const first = async () => {
    setTimeout(() => {
        console.log(1)
    },2000);
}

Вторая:

const second = async () => {
    console.log(2);
}

Я пытаюсь удерживать вторую функцию, пока первая не будет выполнена.Мой код:

router.post('/', errorHandler(async (req, res) => {
    try {

        await first();
        await second();

    } catch (err) {
        console.log(err);
    }
})
);

Но вторая функция выполняется первой.Как мне использовать await, чтобы получить то, что я хочу?Заранее спасибо!

1 Ответ

0 голосов
/ 28 декабря 2018

Проблема в том, что нет способа узнать, когда ваш код готов.Если вы измените первую функцию на что-то вроде следующего, она должна работать:

const first = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(1);
            resolve();
        },2000);
    });
}

По сути, это возвращает обещание, которое разрешится после истечения времени ожидания.Таким образом, ваш await будет ожидать вызова функции resolve.

Вы также можете сделать что-то вроде следующего, чтобы преобразовать setTimeout в обещание.

const timeout = (ms) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve(), ms);
    });
}

const first = async () => {
    await timeout(2000);
    console.log(1);
}

Но самое большоепроблема в том, что вы пытаетесь объединить обратные вызовы и обещания (await).Поэтому в какой-то момент вы должны преобразовать этот обратный вызов (setTimeout) в обещание, чтобы вы могли await it.

...