我在一个简单的脚本中有这个逐字记录:

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链将无法捕获该错误。

避免将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链中调用Promise.all,则可以捕获任何错误。

最佳答案

使用不能抛出的async function-仅在发生异常时返回拒绝的诺言:

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


通常,对执行异步操作的任何函数的期望都是始终返回promise和never throw synchronously。您的map回调应遵循该要求-如有必要,还应在try … catch (e) { return Promise.reject(e); }调用周围加入require。您可能还考虑使用类似于Bluebird's Promise.try的辅助功能。

09-05 00:59
查看更多