javascript - Promise.all catch 的奇怪行为在第一个 promise catch 之后运行,然后全部被拒绝
问题描述
当 catch() 方法在第一个单一承诺之后和所有其他承诺之前触发时,发现 Javascript Promise.all() 的行为非常奇怪。以前有人发现过这种奇怪的东西吗?我想知道这背后发生了什么?
let promises = [];
[1, 2, 3].forEach((value) => {
const promise = new Promise((s, e) => {
setTimeout(() => {
e('Single Catch ' + value);
}, Math.random() * 100);
}).catch((err) => {
console.log(err);
return Promise.reject(err);
});
promises.push(promise);
});
Promise.all(promises).catch((err) => {
console.log('All Done');
});
预期结果将是:
- Single Catch X
- Single Catch X
- Single Catch 1
- All Done
但是我们得到:
- Single Catch X
- All Done
- Single Catch X
- Single Catch X
解决方案
根据文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
当第一个承诺中的任何一个被拒绝时,它就会拒绝。
所以当你的一个 catch 块返回一个被拒绝的承诺时, Promise.all 就完成了。
推荐阅读
- c# - 我如何知道服务是否需要一个字符串数组?
- python - 如果差值大于某个值,则在列表中保留连续数字
- python - 在 Python 中复制迭代器
- javascript - 如何在多折线图中打开和关闭数据点以及线条
- javascript - 在指针位置上使用 css scale() 放大/缩小作为原点会使 div 跳来跳去
- r - 如何将 .txt 冒号分隔的键值对列表转换为以段落分隔的大小写(Rstudio)
- c# - 如何使用 c# 更新 cosmos db 文档
- lua - 给定 lua 脚本中 for 循环语法的解释
- r - 使用 R 动画包含条形图和折线图
- lua - 如何修复 Roblox 无限收益错误?