javascript - 为什么不能对 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);
为什么第二个例子不起作用,而第一个例子不起作用?
提前致谢。
解决方案
请记住,async
函数总是返回一个承诺。
在您不起作用的版本中,您是await
ing 的结果map
,但没有理由这样做,因为map
返回一个数组,而不是一个承诺。async
该数组包含来自对您提供的回调的调用的承诺map
,但它们仍然处于挂起状态,因为没有任何东西等待它们解决(map
对承诺一无所知)。您在回调中的代码在解决回调的 Promise 之前async
等待 Promise fromfetch
解决async
,但没有等待从async
回调到设置的 Promise。
这就是 的目的Promise.all
:它等待 Promise 解决,并使用一系列履行值(而不是一系列 Promise)来履行其承诺。
推荐阅读
- javascript - 单击按钮时如何将按钮的值传递给函数
- c++ - “nullptr”和“NULL”的用例和区别是什么
- react-native - 是否可以在标记上有 react-native-maps 字幕?
- python - 将数据帧写入存储在服务器上的 postgresql 数据库的最快方法是什么?
- r - R闪亮 - 上传后更改文本文件输入
- .net - Windows 10 更新后的 .NET Framework 错误 - 文件丢失
- javascript - 页面加载时在 iframe 上自动点击 3 次
- python-3.x - 如何在 Python 中使用 API 并将数据从一个函数传递到另一个函数
- android-studio - 原因:重复条目:AndroidManifest.xml
- jquery - 在本地 IIS 中启用 Cors