【发布时间】:2020-02-14 22:02:46
【问题描述】:
所以我知道 async/await 不适用于 map。我只是返回我的请求并使用Promise.all() 执行它们。我的问题是我还有其他承诺,想知道Promise.all() 是否也会以正确的顺序执行地图中的承诺。
代码如下:
const productImageIds = Object.keys(data.webImages)
for(let i = productImageIds.length; i--;){
const productId = productImageIds[i]
const images = data.webImages[productId]
const requests = images.map(async (image, i) => {
const name = `${productId}_${i}.${image.split(`.`).pop()}`
const imageStream = await downloadImage(image, name) // IS THIS WORKING CORRECTLY WITH USING PROMISE.ALL() ??
const res = sanityRequest({
...sanityConfig,
type: `images`,
endpoint: `assets`,
contentType: `image/jpeg`,
body: imageStream,
params: `?filename=${name}`,
})
await unlinkSync(name) // IS THIS WORKING CORRECTLY WITH USING PROMISE.ALL() ??
return res
})
const uploadedImages = await Promise.all(requests)
}
【问题讨论】:
-
并发 Promise 永远不会按照给定的顺序执行。
Promise.all在所有 Promise 结束时解析,无论它们的顺序如何。 -
只是一个简短的说明。您可能希望将
for(let i = productImageIds.length; i--;){更改为for(let i = productImageIds.length-1; i--;){以避免访问越界。
标签: javascript arrays async-await