Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建可重用的承诺而不使用.catch_Javascript - Fatal编程技术网

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%错误的。