有没有办法克服的callback,如果(err)在Node.js样板?

随着项目的发展,我们开始有了这个非常感激,防御性的代码片段几乎无处不在:

func(err, result){ if(err){ console.log('An error occurred!, @myModule :' + err); return callback(err); } //then the rest.. } 

快速谷歌search揭示了一些试图克服这个共同关注的库,例如https://www.npmjs.com/package/callback-wrappers 。

但是,在不影响早期的error handling机制的情况下,最小化样板代码的最佳方法是什么?

有几种方法可以帮助缓解这个问题,都使用外部模块。

首先,我的首选方法是使用asynchronous ,特别是async.series , async.parallel或async.waterfall 。 如果在任何asynchronous调用中发生错误,这些方法中的每一个都会直接跳到最后一个函数,从而防止在整个callback过程中出现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 } }); 

另一种select是使用承诺库,如q 。 这有一个函数Q.denodeify来帮助你将callback风格的代码包装为promise风格。 承诺,你使用.then. .catch.done

 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采用的真正的callback风格。