Оболочка Promise.all, которая может перехватывать ошибки - PullRequest
0 голосов
/ 08 мая 2018

У меня есть это дословно в простом сценарии:

Promise.all(links.map(function (l) {
  return Promise.resolve(require(l).r2gSmokeTest())
     .then((v:any) => ({path: l, result: v}));
}))
.then(function(results){

})
.catch(function(e){

}):

проблема в том, что если вызов require() выдает ошибку по какой-либо причине, цепочка обещаний не поймает ее.

- это самое простое, что нужно сделать, чтобы избежать оборачивания Promise.all в функцию, например, так:

const getAllPromises = function(links){
   return Promise.resolve(null).then(function(){
       return Promise.all(links.map(function (l) {
         return Promise.resolve(require(l).r2gSmokeTest())
         .then((v:any) => ({path: l, result: v}));
}));

мне кажется, что, возможно, Promise.all должен иметь другой API, что-то вроде:

Promise.all(function(){
   return values.map(v => whatever);
});

таким образом любые ошибки могут быть перехвачены, если Promise.all не вызывается в цепочке Promise ...

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Ваш require() происходит на уровне карты вне контекста Promise, поэтому он немедленно распространяется на глобальный уровень, поэтому, если вы просто поместите его в new Promise, он должен обработать ошибку, как и ожидалось:

Promise.all(links.map(function(l) {
    return new Promise(resolve => resolve(require(l).r2gSmokeTest())) // <-- here
      .then((v: any) => ({
        path: l,
        result: v
      }));
  }))
  .then(function(results) {

  })
  .catch(function(e) {

  }):
0 голосов
/ 08 мая 2018

Используйте async function, который не может сгенерировать - он вернет отклоненное обещание, только когда произойдет исключение:

Promise.all(links.map(async function (l) {
  const v: any = await require(l).r2gSmokeTest();
  return {path: l, result: v};
}))

Как правило, ожидание для любой функции, выполняющей что-то асинхронное, всегдаверните обещание и никогда не бросайте синхронно .Ваш map обратный вызов должен придерживаться этого - и try … catch (e) { return Promise.reject(e); } вокруг require вызова, если необходимо.Вы можете также рассмотреть возможность использования вспомогательной функции, которая работает как Bluebird Promise.try.

...