使用Promise.all进行错误处理

时间:2015-08-18 12:46:13

标签: javascript es6-promise

我在使用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()中只有一个承诺数组,其中一个拒绝)

1 个答案:

答案 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')]]);