nodejs, async в Reduce, await не ждет разрешения обещания - PullRequest
0 голосов
/ 11 февраля 2019

Не понимаю, почему все обещания выполняются одновременно.Я читал, что await не работает должным образом в цикле forEach, но он не работает с map либо

const promise = async (ms, name) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`resolving ${name}`)
            resolve(name)
        }, ms)
    });
}

async function main() {
    ['foo', 'bar', 'baz'].reduce(async (accum, curr) => {
        const res = await promise(1000, curr)
        return res
    }, Promise.resolve(''))
}

main()

Но в этом сценарии ожидание отлично работает:

async function main2() {
    const ms = 1000
    await promise(ms, "foo")
    await promise(ms, "bar")
    await promise(ms, "baz")
}

main2()

1 Ответ

0 голосов
/ 11 февраля 2019

Каждая итерация обратного вызова reduce будет инициализироваться синхронно .Вам нужно подождать, пока накопитель из последней итерации (к счастью, уже Promise) разрешится, прежде чем запускать тело обратного вызова reduce:

const promise = async (ms, name) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`resolving ${name}`)
            resolve(name)
        }, ms)
    });
}

async function main() {
    ['foo', 'bar', 'baz'].reduce(async (accum, curr) => {
        // don't progress further until the last iteration has finished:
        await accum;
        const res = await promise(1000, curr)
        return res
    }, Promise.resolve(''))
}

main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...