使用 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')]]);