有幾種方法可以幫助緩解這個問題,都使用外部模塊。
首先,我的首選方法是使用async,特別是async.series,async.parallel或async.waterfall。如果在任何異步調用中發生錯誤,這些方法中的每一個都會直接跳到最後一個函數,從而防止在回調期間出現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。這有一個功能Q.denodeify
可幫助您將回調式代碼包裝爲承諾樣式。有了承諾,你用.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已通過。
使用承諾:https://www.promisejs.org/ – mbcrute 2015-02-24 14:18:40