首页 > 解决方案 > 为什么不能对 Promise 数组中的每个映射元素使用“await”而不是“promise.all”?

问题描述

我有一组已解决的 fetch API 调用,如下所示:

let results = await Promise.all(promises);

我正在尝试获取数组中每个已解析的 fetch API 调用的结果。我尝试控制台记录结果,期待已解决的响应

const newStuff = await results.map(async (response) => {
  try {
    const recipeDetail = await response.json();
    return recipeDetail;
  } catch (err) {
    console.log("error1: ", err);
  }
})

console.log(newStuff);

但我得到了一系列未决的承诺。

然而,这似乎工作。

const newStuff = await Promise.all(results.map(async response => {
  let recipeDetail = await response.json();
  return recipeDetail;
}));

console.log(newStuff);

为什么第二个例子不起作用,而第一个例子不起作用?

提前致谢。

标签: javascriptasync-awaitpromiseequivalence

解决方案


请记住,async函数总是返回一个承诺。

在您不起作用的版本中,您是awaiting 的结果map,但没有理由这样做,因为map返回一个数组,而不是一个承诺。async该数组包含来自对您提供的回调的调用的承诺map,但它们仍然处于挂起状态,因为没有任何东西等待它们解决(map对承诺一无所知)。您在回调中的代码在解决回调的 Promise 之前async等待 Promise fromfetch解决async,但没有等待从async回调到设置的 Promise。

这就是 的目的Promise.all:它等待 Promise 解决,并使用一系列履行值(而不是一系列 Promise)来履行其承诺。


推荐阅读