有没有办法克服的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风格。