最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

的NodeJS,异步在减少,等待不等待承诺的决心

IT培训 admin 5浏览 0评论

的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()

但等待在这种情况下细的工作原理:

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

main2()
回答如下:

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()

的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()

但等待在这种情况下细的工作原理:

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

main2()
回答如下:

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()
发布评论

评论列表 (0)

  1. 暂无评论