首页 > 解决方案 > nodejs,异步在减少,等待不等待承诺解决

问题描述

我不明白为什么所有的承诺都会在同一时间得到解决。我读到它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()

但是 await 在这种情况下可以正常工作:

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

main2()

标签: node.jsasync-await

解决方案


回调的每次迭代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()


推荐阅读