在我的代码中,我使用Promise.all()
在一些承诺全部完成后异步运行代码。有时,一个承诺会失败,我不知道为什么。 我想知道哪个承诺失败。将回调作为第二个参数传递给.then
方法并没有多大帮助,因为我知道 承诺拒绝但不是哪个承诺拒绝。
堆栈跟踪也没有帮助,因为第一项是Promise.all()
的错误处理程序。传递给传递给Error
的{{1}}函数的第二个函数的第一个参数的try
对象的行号只是我记录行号的行号
有人知道找出哪个承诺拒绝的方法吗?
答案 0 :(得分:15)
您可以在每个承诺上使用onreject
处理程序:
Promise.all(promises.map((promise, i) =>
promise.catch(err => {
err.index = i;
throw err;
});
)).then(results => {
console.log("everything worked fine, I got ", results);
}, err => {
console.error("promise No "+err.index+" failed with ", err);
});
通常,每个拒绝原因都应包含足够的信息来识别您需要处理(或记录)的问题。
答案 1 :(得分:2)
这个包装器将等待并返回每个结果和/或拒绝
返回的数组将是对象
{ // this one resolved
ok: true,
value: 'original resolved value'
},
{ // this one rejected
ok: false,
error: 'original rejected value'
},
{ // this one resolved
ok: true,
value: 'original resolved value'
},
// etc etc
一个警告:这将等待所有承诺解决或拒绝,而不是在第一次拒绝发生后立即拒绝
let allresults = function(arr) {
return Promise.all(arr.map(item => (typeof item.then == 'function' ? item.then : Promsie.resolve(item))(value => ({value, ok:true}), error => ({error, ok:false}))));
}
allresults(arrayOfPromises)
.then(results => {
results.forEach(result => {
if(result.ok) {
//good
doThingsWith(result.value);
} else {
// bad
reportError(result.error);
}
});
});