我在 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 代替。无论哪种情况,我都喜欢通过使用异步或承诺来避免嵌套回调。
不使用嵌套回调可以避免的一些事情是变量冲突、提升错误、向右“行进”> > > >、难以阅读的代码等。