使用 Promise.all 进行错误处理
Error Handling with Promise.all
我在 Promise.all
的错误处理方面遇到了问题
我希望以下代码在 getNetworkstuff()
Promise 之一失败时调用链的 catch 部分。但它只是调用下一个 then 部分,浏览器控制台显示未捕获的错误。
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()
中有一个 Promises 数组,其中一个被拒绝)
看看你的主机
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);
});
注意它输出 "It worked",在任何事情解决前 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
您能看出下面的代码与您对可能会或可能不会 return 承诺的函数结果数组所做的操作具有相似的模式吗?无论如何,拿走承诺和其他东西......你得到了这个
function fn(s) {
return s.toUpperCase();
}
function fn2(arr) {
console.log(arr); // [["A"], ["B"]]
}
fn2([[fn('a')],[fn('b')]]);
我在 Promise.all
的错误处理方面遇到了问题我希望以下代码在 getNetworkstuff()
Promise 之一失败时调用链的 catch 部分。但它只是调用下一个 then 部分,浏览器控制台显示未捕获的错误。
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()
中有一个 Promises 数组,其中一个被拒绝)
看看你的主机
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);
});
注意它输出 "It worked",在任何事情解决前 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
您能看出下面的代码与您对可能会或可能不会 return 承诺的函数结果数组所做的操作具有相似的模式吗?无论如何,拿走承诺和其他东西......你得到了这个
function fn(s) {
return s.toUpperCase();
}
function fn2(arr) {
console.log(arr); // [["A"], ["B"]]
}
fn2([[fn('a')],[fn('b')]]);