我在使用Promise.all
进行错误处理方面遇到了问题我希望以下代码在其中一个getNetworkstuff()
Promises失败时调用链的catch部分。但它只是调用下一个部分而浏览器控制台显示未被捕获的错误。
Promise.all(
[[getNetworkstuff(url1)],[getNetworkstuff(url2)]]
//please note that the arrays within the array are larger in my application
//otherwise I would just use one big array not arrays in arrays
)
.then(function(result){//Stuff worked})
.catch(function(err){//Stuff broke});
function getNetworkstuff(url){
return new Promise(function(resolve,reject){//here will be awesome network code})
}
我可以看到承诺未履行,因为返回的result
数组包含相应的被拒绝的承诺。
[[PromiseStatus]]: "rejected"
[[PromiseValue]]: Error: HTTP GET resulted in HTTP status code 404.
有人可以告诉我为什么不调用catch
? (我知道如果我在Promise.all()
中只有一个承诺数组,其中一个拒绝)
答案 0 :(得分:2)
查看您的控制台
function getNetworkstuff(url) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('resolving', url);
resolve(url);
}, 5000);
});
}
Promise.all([[getNetworkstuff('url1')],[getNetworkstuff('url2')]])
.then(function(result){
console.log('It worked', result);
})
.catch(function(err){
console.log('It failed', result);
});
注意它输出"它工作",在解决任何问题之前5秒
Promise.all([getNetworkstuff('url1'), getNetworkstuff('url2')])
.then(function(result){
console.log('It worked', result);
})
.catch(function(err){
console.log('It failed', result);
});
现在比较没有数组的数组 - 注意两种情况下It Worked
旁边记录的内容的差异
最后,运行此
function getNetworkstuff(url) {
return new Promise(function(resolve, reject) {
if(url == 'url1') {
setTimeout(function() {
console.log('resolving', url);
resolve(url);
}, 5000);
}
else {
console.log('rejecting', url);
reject(url);
}
});
}
Promise.all([getNetworkstuff('url1'), getNetworkstuff('url2')])
.then(function(result){
console.log('It worked', result);
})
.catch(function(err){
console.log('It failed', result);
});
您的后续问题:how are they kicked of if not being recognized as promises
你能看到下面的代码与你正在使用的函数结果数组的模式类似,这些函数可能会也可能不会返回promises?无论如何,带走承诺和当时的东西......你已经得到了这个
function fn(s) {
return s.toUpperCase();
}
function fn2(arr) {
console.log(arr); // [["A"], ["B"]]
}
fn2([[fn('a')],[fn('b')]]);