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