首页 > 解决方案 > javascript中的数组异步调用(Promise.all)

问题描述

我想知道当我们需要对数组的每个元素调用异步函数并等待所有 Promise 解决时,最佳实践是什么。假设我们不需要更改原始数组。

例如,假设我有一个对象数组,每个对象都需要使用一个build()函数异步构建,该函数返回一个 Promise。在按照说明继续之前,我需要等待它们建成。目前,我将执行以下操作。

async function myFunction() {
    await Promise.all(myObjArray.map(myObj => myObj.build()));
    {...}
}

但是,我认为这可能是一种不好的方法,因为根据文档Array.prototype.map(),在这种情况下不应该使用该函数。但是,我不知道什么是一个好的选择,因为它不起作用。forEach

何时不使用 map()

由于 map 构建了一个新数组,因此在不使用返回的数组时使用它是一种反模式;使用 forEach 或 for...of 代替。

如果出现以下情况,您不应该使用地图:

你没有使用它返回的数组;和/或您没有从回调中返回值。

谢谢!

标签: javascriptarraysasynchronouspromise

解决方案


根据文档,这可能是一种不好的方法,因为Array.prototype.map()在这种情况下不应使用该函数:

由于 map 构建了一个新数组,因此在不使用返回的数组时使用它是一种反模式;使用 forEach 或 for...of 代替。

这不是一个坏方法。您正在使用返回的数组:您将其传递给Promise.all. 没有它是行不通的。obj.build()返回一个承诺,您需要将它们收集到一个数组中。map是完美的解决方案。

如果承诺不满足undefined(即没有结果),但使用构建的对象,那就更好了,这样你就可以写

async function buildFrom(oldObj) {
    …
    return newObj;
}
const builtObjects = await Promise.all(myObjArray.map(buildFrom));

推荐阅读