Javascript 创建可重用的承诺而不使用.catch
我在一个新的代码库中工作,它有一个模式,其中一些可重用函数从一个链返回一个承诺,但它们不处理错误 以下是一个例子:Javascript 创建可重用的承诺而不使用.catch,javascript,Javascript,我在一个新的代码库中工作,它有一个模式,其中一些可重用函数从一个链返回一个承诺,但它们不处理错误 以下是一个例子: function createScheduleForGroup(group) { if (notInProduction()) { group.gschedScheduleId = '0'; return Bluebird.resolve(group); } // note: schedule is a global within the file re
function createScheduleForGroup(group) {
if (notInProduction()) {
group.gschedScheduleId = '0';
return Bluebird.resolve(group);
}
// note: schedule is a global within the file
return schedule.createSchedule(group.name).then(function (schedule) {
group.gschedScheduleId = schedule.id;
return group.save();
});
}
在上面的示例中,没有传递给的.catch
或reject
函数
该功能最终用于处理错误的快速路线:
router.post('/schedule', function(req, res, next) {
scheduleLogical
.createScheduleGroup(req[config.entity])
.then(function(group) {
res.status(201).json(group);
})
.catch(next);
// if creteScheduleGroup throws an error it is handled here
不为函数返回的承诺定义错误处理程序,并预测使用该函数的人附加适当的错误处理程序,这是一种常见模式吗?
为了让我自己的理解更清楚,我对这个特定函数和promise链中使用的所有函数进行了模拟。这是:
函数getScheduleMock(){
//这个承诺承诺是一个使用回调的旧api
返回新承诺((解决、拒绝)=>{
//注意,这是在模拟api调用:
const response=Math.round(Math.random());
//0==错误,1==成功
如果(响应===0)返回拒绝(响应);
决心(回应);
})
//错误hanlding:)
.catch(错误=>{
控制台日志(err);
退回承诺。拒绝(错误);
//有一个错误处理函数记录错误。如果错误与预期错误不匹配,它会再次拒绝错误,就像我在这里所做的那样。
})
.然后(响应数据=>{
返回承诺。解决(responseData);
})
}
函数createScheduleForGroupMock(){
返回getScheduleMock();
//注意:原始组的group.save()返回一个承诺
//就像实际的例子一样,承诺被返回
//但是除了getScheduleMock函数之外,没有任何形式的错误处理
}
createScheduleForGroupMock();//当getScheduleMock中的.catch()中拒绝该错误时,将不处理该错误。
/* ***************** */
/*createScheduleForGroup方法在具有错误处理的快速路由中使用,以下是代码示例:*/
//router.post('/schedule',函数(req、res、next){
//计划逻辑
//.createScheduleGroup(请求[config.entity])
//.then(功能(组){
//res.status(201).json(组);
// })
//.接住(下一个);
//如果creteScheduleGroup抛出错误,则在此处处理该错误
,每个函数中都可以有一个错误处理程序
function aPromise() {
return new Promise(function(resolver, reject){
//Handle any error here and attach different information via your own errror class
})
}
async function parentProcess() {
try{
await aPromise()
}
catch(e) {
//Handle and attach more info here
}
}
function grandParentProcess() {
try{
parentProcess();
}
catch(e){
//Handle the error
}
}
如果父函数通过处理父函数中的错误来避免未处理的PromiserRejection
错误,则基本上不必处理父函数中的错误
不为函数返回的承诺定义错误处理程序,并期望使用该函数的人附加适当的错误处理程序,这是一种常见模式吗
是的,完全正确。这不仅仅是“普通模式”,而是绝对标准模式
就像您没有在每个同步函数中放入
try
/catch
语句一样,您也没有在返回的每个承诺上放入.catch
回调。事实上,它是为了捕获您无法处理的错误。承诺错误处理与常规错误处理没有任何不同,您应该只捕获catch代码>当您可以优雅地处理错误时,在所有其他情况下,错误处理都应该推迟到调用方法。我还将添加catch log rethrow是一种反模式。理想情况下,您可以在关闭并重新启动应用程序之前,将错误气泡一直记录到记录错误的处理程序,或者在关闭并重新启动应用程序时记录错误处理(如有必要)。谢谢!我想我的主要问题是,在处理更大的代码库时,在创建返回承诺的函数时是否有最佳做法?我知道如果祖父母函数处理异常,则可以处理异常,但如果没有祖父母函数,会发生什么情况?正如您所提到的,可能存在uncaughtExceptionHandler
,但我觉得依赖它是不自然的,从我的理解来看,它就像是uncaughExceptionHandler
存在,以防抛出未处理的错误。很可能我对这一点的看法是100%错误的。