Добавьте улов к нескольким обещаниям позже программно - PullRequest
0 голосов
/ 09 декабря 2018

У меня было несколько обещаний, которые делают то же самое, я надеялся программно добавить к ним оператор catch, а затем запустить на них Promise.all.У меня было несколько идей для достижения этой цели, но это продолжает взрываться у меня на лице.

let promises = [
  Promise.reject('derp'), // Naïve test
  new Promise((resolve, reject) => { // Assumed this ran out of main loop
    reject('whayyy')
  }),
  new Promise((resolve, reject) => { // really assumed this ran out of main loop
    process.nextTick(() => reject('nooooon'))
  })
]

//fails
for(let promise of promises){
  promise.catch((err) => { return 'fixed programatically'} )
}
Promise.all(promises).then((things) => {
  console.log("Expect to make it here with no problems")
  console.log(things) 
})

Я продолжаю получать это для всех трех обещаний:

(node:25148) UnhandledPromiseRejectionWarning: derp|whayy|nooooon
(node:25148) UnhandledPromiseRejectionWarning: Unhandled promise rejection. 
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)

Кто-нибудь знает, как правильносделать это?

Редактировать: я не уверен, почему, я перезапустил оригинальный код и больше не получаю никаких ошибок.(

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Promise.all полностью потерпит неудачу, как только произойдет сбой одного из обещаний в массивах.

Чтобы обойти это, используйте функцию карты.

promises.map(promise => {
      return new Promise((resolve, reject) => {
        promise.then(resolve).catch(resolve);
      });
  });

Итак, то, что мы делаем в вышеприведенном, - это возвращение нового обещания и всегда его выполнение.Затем передайте это Promise.all

0 голосов
/ 09 декабря 2018

Вам нужно будет заменить каждое обещание в массиве новым обещанием, которое является результатом вызова catch.В противном случае у вас все еще остается исходное (отклоненное) обещание в массиве, а затем Promise.all заканчивается повторным отклонением, и, поскольку вы не поймете это, вы получите необработанную ошибку отклонения обещания.

Лучший способчтобы заменить обещания в массиве, вероятно, просто используйте Array # map для всего массива:

promises = promises.map( promise => 
  promise.catch((err) => { return 'fixed programatically'} )
);

Полный код (используя setTimeout, чтобы он мог работать в браузере):

let promises = [
  Promise.reject('derp'), // Naïve test
  new Promise((resolve, reject) => { // Assumed this ran out of main loop
    reject('whayyy')
  }),
  new Promise((resolve, reject) => { // really assumed this ran out of main loop
    setTimeout(() => reject('nooooon'),0)
  }),
  Promise.resolve( 'success case, doesn\'t need fixing' ),
]

promises = promises.map( promise => 
  promise.catch((err) => { return 'fixed programatically'} )
);

Promise.all(promises).then((things) => {
  console.log("Expect to make it here with no problems")
  console.log(things) 
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...