我在Node中經常使用的庫是Async(https://github.com/caolan/async)。最後,我檢查了這也支持瀏覽器,所以你應該能夠在你的發行版中使用npm/concat/minify。如果您在服務器端使用此功能,則只應考慮https://github.com/continuationlabs/insync,這是一個稍微改進的Async版本,其中部分瀏覽器支持已刪除。
我在使用條件異步調用時使用的常見模式之一是使用我要按順序使用的函數並將其傳遞給async.waterfall。
我已經在下面包含了一個例子。
var tasks = [];
if (conditionOne) {
tasks.push(functionOne);
}
if (conditionTwo) {
tasks.push(functionTwo);
}
if (conditionThree) {
tasks.push(functionThree);
}
async.waterfall(tasks, function (err, result) {
// do something with the result.
// if any functions in the task throws an error, this function is
// immediately called with err == <that error>
});
var functionOne = function(callback) {
// do something
// callback(null, some_result);
};
var functionTwo = function(previousResult, callback) {
// do something with previous result if needed
// callback(null, previousResult, some_result);
};
var functionThree = function(previousResult, callback) {
// do something with previous result if needed
// callback(null, some_result);
};
當然你可以使用promise來代替。在任何情況下,我都喜歡通過使用異步或promise來避免嵌套回調。
你們當中有些人可以通過不使用嵌套回調避免的事情是可變的碰撞,吊裝錯誤,「行軍」向右>>>>,難讀碼等
異步等待包可以幫助(允許以同步樣式編寫異步代碼,支持異常等)https://www.npmjs.com/package/asyncawait - 在將來的Node版本中也會本地支持此類語法,請參閱https:// github。com/nodejs/promises/issues/4 –