有没有办法克服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)检查。。