2015-08-18 3 views
3

я столкнулся вопрос в отношении обработки ошибок с Promise.allОбработка ошибок с помощью Promise.all

Я хотел бы ожидать следующий код для вызова крылатой части цепи, когда один из getNetworkstuff() Promises терпит неудачу. Но вместо этого он просто вызывает следующую, затем часть, а в Консоли браузера отображается нечеткая ошибка.

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 не называется? (Я знаю, что если я просто массив Promises в Promise.all() из которых один отторгает)

+3

У вас есть массив массивов. Скорее всего, вам нужно будет называть 'Promise.all' для каждого. –

+1

Promise.all берет массив обещаний как аргумент, а не массив массивов –

+0

На самом деле, я пробовал массивы массивов, и он действительно работает через них – Baiteman

ответ

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); 
}); 

Ваш вопрос Followup: how are they kicked of if not being recognized as promises

Вы можете видеть, что приведенный ниже код имеет такой же шаблон, что вы делаете с вашим массива из массива результатов функций, которые могут или не могут возвращать обещания? Во всяком случае, уберите обещания и затем материал ... и у вас есть это

function fn(s) { 
    return s.toUpperCase(); 
} 
function fn2(arr) { 
    console.log(arr); // [["A"], ["B"]] 
} 
fn2([[fn('a')],[fn('b')]]); 
+0

Просто быстрый вопрос, если вы не возражаете. Если Promise.all не распознает содержимое массивов в качестве обещаний подождать, прежде чем звонить, то как их пнуть, если они не будут признаны в качестве обещаний? – Baiteman

+0

Лучшее объяснение здесь - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all –

+0

Спасибо, что ответили на мой вопрос. Я прочитал страницу Mozilla и не нашел ответа на мой следующий вопрос, но я ценю время для ответа на оба моих вопроса. – Baiteman

Смежные вопросы