我在一个简单的脚本中有这个逐字记录:
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
的辅助功能。