在不使用.catch

时间:2019-02-26 18:48:10

标签: javascript

我正在一个新的代码库中工作,该代码库具有一种模式,其中一些可重用的函数从链中返回一个Promise,但是它们不处理错误。

这里是一个例子:

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();
  });
}

在上面的示例中,没有.catchreject函数传递给.then

该函数最终用于处理错误的快速路由中:

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链中使用的所有功能。在这里:

function getScheduleMock() {
  // this promise promisifys an older api that uses callbacks
  return new Promise((resolve, reject) => {
    // note this is simulating an api call:
    const response = Math.round(Math.random());
    // 0 === err, 1 === success

    if(response === 0) return reject(response);
    resolve(response);
    
  })
  // error hanlding :)
  .catch(err => {
    console.log(err);
    return Promise.reject(err);
    // there is an error handling function that logs the errors. If the error doesn't match expected errors, it rejects the error again as I have here.
  })
  .then(responseData => {
    return Promise.resolve(responseData);
  })
}

function createScheduleForGroupMock() {
  return getScheduleMock().then(responseData => Promise.resolve('everything worked :)'));
 // Note: group.save() from the original returns a promise
  // just like the actual example, the promise is returned
  // but there isn't any form of error handling except within the getScheduleMock function
}

createScheduleForGroupMock(); // when the error is rejected in the .catch() in getScheduleMock, the error is unhandled.

/* ***************** */


/* the createScheduleForGroup method is used within an express route which has error handling, here is an example of the code: */

// 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

我对错误处理承诺还很陌生,从我一直阅读和实践的经验来看,我通常认为您应该始终包括错误处理程序。我正在使用的代码库有很多使用createScheduleForGroup模式的方法,其中在函数中没有定义错误处理程序,而是在使用函数后对其进行处理和附加。

createScheduleForGroup中使用的某些函数会处理自己的错误,我对何时处理返回承诺的函数中的错误以及何时使用附加时附加错误的平衡感到困惑和好奇功能。

2 个答案:

答案 0 :(得分:2)

  

不为函数返回的promise定义错误处理程序,而期望使用该函数的人附加适当的错误处理程序是常见的模式吗?

是的,完全是。这不仅仅是“通用模式”,而是绝对的标准模式。

就像您没有在每个同步函数中放置try / catch语句一样,您也没有在返回的每个诺言上放置.catch回调。实际上,considered an antipattern可以捕获您无法处理的错误。

答案 1 :(得分:-1)

每个函数中都可以有一个错误处理程序。

#----------------------------------
# api.php
#----------------------------------

Route::group(['middleware' => 'jwt.auth'], function () {
    Route::apiResource('flights', 'Api\\FlightControllerAPI');
    Route::apiResource('airlines', 'Api\\AirlineControllerAPI');
});

如果父级父函数处理该函数以避免#-------------------------------- # BroadcastServiceProvider.php #-------------------------------- <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Broadcast; class BroadcastServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { // Broadcast::routes(); Broadcast::routes(['middleware' => ['jwt.auth']]); require base_path('routes/channels.php'); } } 错误,则基本上不必处理父函数中的错误。