async是一个流行的异步流控制库,经常与 node.js 一起使用。我从来没有亲自在浏览器中使用过它,但显然它也可以在那里工作。
此示例将(理论上)运行您的两个函数,返回所有文件名及其加载状态的对象。 async.map
并行运行,whilewaterfall
是一个系列,将每个步骤的结果传递到下一个步骤。
我在这里假设您的两个异步函数接受回调。如果他们不这样做,我需要更多关于他们打算如何使用的信息(他们是否会在完成时触发事件?等等)。
async.waterfall([
function (done) {
fetchFiles(source, function(list) {
if (!list) done('failed to fetch file list');
else done(null, list);
});
// alternatively you could simply fetchFiles(source, done) here, and handle
// the null result in the next function.
},
function (file_list, done) {
var loadHandler = function (memo, file, cb) {
loadFile(file, function(data) {
if (!data) {
display('failed to load: ' + file);
} else {
display(data);
}
// if any of the callbacks to `map` returned an error, it would halt
// execution and pass that error to the final callback. So we don't pass
// an error here, but rather a tuple of the file and load result.
cb(null, [file, !!data]);
});
};
async.map(file_list, loadHandler, done);
}
], function(err, result) {
if (err) return display(err);
// All files loaded! (or failed to load)
// result would be an array of tuples like [[file, bool file loaded?], ...]
});
waterfall
接受一个函数数组并按顺序执行它们,将每个函数的结果作为参数传递给下一个,以及作为最后一个参数的回调函数,您可以使用错误或函数的结果数据调用该函数。
您当然可以在这两者之间或周围添加任意数量的不同异步回调,而根本无需更改代码的结构。 waterfall
实际上只是 10 种不同的流控制结构中的一种,因此您有很多选择(尽管我几乎总是最终使用auto
,它允许您通过类似 Makefile 的需求语法在同一个函数中混合并行和串行执行)。