有没有办法克服Node.js中的回调if(err)样板文件?

有没有办法克服Node.js中的回调if(err)样板文件?,node.js,callback,Node.js,Callback,随着您的项目的发展,我们开始在几乎所有地方都有这段备受赞赏的防御性代码片段: func(err, result){ if(err){ console.log('An error occurred!, @myModule :' + err); return callback(err); } //then the rest.. } 快速的谷歌搜索揭示了一些试图克服这一共同问题的LIB,例如 但是,在不影响我们的早期错误处理机制的情况下,最小化样板

随着您的项目的发展,我们开始在几乎所有地方都有这段备受赞赏的防御性代码片段:

func(err, result){
   if(err){

      console.log('An error occurred!, @myModule :' + err);
      return callback(err);
    }

    //then the rest.. 
}
快速的谷歌搜索揭示了一些试图克服这一共同问题的LIB,例如


但是,在不影响我们的早期错误处理机制的情况下,最小化样板代码的最佳方法是什么?

有几种方法可以帮助缓解此问题,它们都使用外部模块

首先,也是我喜欢的方法,是使用,尤其是,或。如果在任何异步调用中发生错误,这些方法都将直接跳到最后一个函数,从而防止在整个回调过程中出现
if(err)
条件

例如:

async.waterfall([
  function(cb) {
    someAsyncOperation(cb);
  },
  function(result, cb) {
    doSomethingAsyncWithResult(result, cb);
  }
], function(err, result) {
  if(err) {
    // Handle error - could have come from any of the above function blocks
  } else {
    // Do something with overall result
  }
});
另一个选项是使用承诺库,例如。这有一个函数
Q.denodeify
,可以帮助您将回调风格的代码包装成承诺风格。对于承诺,您使用
。然后。
。捕获
。完成

var qSomeAsyncOperation = Q.denodeify(someAsyncOperation);
var qDoSomethingAsyncWithResult = Q.denodeify(doSomethingAsyncWithResult);

Q()
  .then(qSomeAsyncOperation)
  .then(qDoSomethingAsyncWithResult)
  .done(function(result) {
    // Do something with overall result
  }, function(err) {
    // Handle error - could have come from any of the above function blocks
  });

我更喜欢使用
async
,因为它更容易理解正在发生的事情,并且更接近node.js所采用的真正回调风格。

使用承诺:感谢您的回答!我们已经在使用async,但随着解耦函数和模块数量的增加,我们仍然会进行大量的if(err)检查。。