在循环中使用 async/await
Using async/await in a loop
我知道已经有很多类似的问题,但 none 似乎解决了这个特定问题。我有一个包含 forEach 循环的 Javascript 函数,在 forEach 循环内部,有异步调用。
代码大致如下:
const handleConvert = () => {
const refs = { ...imageRefs.current }
// Outer loop
Object.keys(refs).forEach(key => {
// Inner loop
refs[key].forEach(ref => {
toPng(ref)
.then((dataUrl) => {
props.setImageUrls(old => {
return {
..old,
[key]: [...old[key], dataUrl]
}
})
})
.catch(err => {
console.error(err)
})
})
})
setConverting(false)
setConverted(true)
}
refs
是一个包含 2 个键的对象,每个键都有一个数组作为它的值。它看起来像这样:
{
a: [1, 2, 3],
b: [3, 4, 5]
}
toPng() 函数returns 一个承诺。在执行外部 forEach 循环之后的代码之前,我试图等待所有这些承诺得到解决:
if (mounted) {
setConverting(false)
setConverted(true)
}
有没有办法在外循环之后执行代码之前等待所有的承诺解决?也许用 Promise.all()?
嵌套另一个 Promise.all
以等待每个子数组完成。确保将每个 Promise 映射并 return 到调用者,以便 Promise.all
正常运行。
Promise.all(
Object.entries(refs)
.map(([key, arr]) => Promise.all(
arr.map(num =>
toPng(num).then(dataUrl => {
props.setImageUrls(old => ({ ...old, [key]: [...old[key], dataUrl] }))
})
)
))
)
.then( // all done
我知道已经有很多类似的问题,但 none 似乎解决了这个特定问题。我有一个包含 forEach 循环的 Javascript 函数,在 forEach 循环内部,有异步调用。
代码大致如下:
const handleConvert = () => {
const refs = { ...imageRefs.current }
// Outer loop
Object.keys(refs).forEach(key => {
// Inner loop
refs[key].forEach(ref => {
toPng(ref)
.then((dataUrl) => {
props.setImageUrls(old => {
return {
..old,
[key]: [...old[key], dataUrl]
}
})
})
.catch(err => {
console.error(err)
})
})
})
setConverting(false)
setConverted(true)
}
refs
是一个包含 2 个键的对象,每个键都有一个数组作为它的值。它看起来像这样:
{
a: [1, 2, 3],
b: [3, 4, 5]
}
toPng() 函数returns 一个承诺。在执行外部 forEach 循环之后的代码之前,我试图等待所有这些承诺得到解决:
if (mounted) {
setConverting(false)
setConverted(true)
}
有没有办法在外循环之后执行代码之前等待所有的承诺解决?也许用 Promise.all()?
嵌套另一个 Promise.all
以等待每个子数组完成。确保将每个 Promise 映射并 return 到调用者,以便 Promise.all
正常运行。
Promise.all(
Object.entries(refs)
.map(([key, arr]) => Promise.all(
arr.map(num =>
toPng(num).then(dataUrl => {
props.setImageUrls(old => ({ ...old, [key]: [...old[key], dataUrl] }))
})
)
))
)
.then( // all done