【问题标题】:Using Async/Await with Array.map将 Async/Await 与 Array.map 一起使用
【发布时间】: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


【解决方案1】:

我的问题是我还有其他承诺,想知道 Promise.all() 是否也会以正确的顺序执行地图中的承诺。

没有。

Promise.all() 将创建一个 Promise,当所有传递给它的 Promise 都解决时,该 Promise 就会解决。它对这些承诺的解决顺序没有影响(并且不能,因为它们将在Promise.all 被调用之前开始运行)。

如果您想按顺序处理images 的每个值(而不是并行处理),请使用常规的for 循环。

【讨论】:

    猜你喜欢
    • 2017-11-05
    • 2019-04-15
    • 2014-06-19
    • 2018-01-14
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多