async的waterfall提供了一种串行的执行流,将所有异步函数串联起来,只有前面的操作执行完了才会执行后面的操作。
代码如下:
var async = require('async');
async.waterfall([function(cb) {
cb(null, 'hello');
}, function(param1, cb) {
console.log(param1);
cb(null, 'hello', 'world');
}, function(param1, param2, cb) {
console.log(param1, ' ', param2);
cb(null, 'result');
}], function(err, result) {
console.log(result);
});
输出:
hello
hello world
result
通过代码可以很清楚地看到,各个异步函数之间是通过cb(callback)来传递函数执行结果给下一个异步函数的。
这里需要注意的是cb的第一个参数,如果cb的第一个参数不为null,代表有错误,则该异步函数之后的所有异步函数都将跳过,直接执行function(err,result){}。
将代码修改为如下:
var async = require('async');
async.waterfall([function(cb) {
cb('some error', 'hello');
}, function(param1, cb) {
console.log(param1, ' ', 'from first async function');
cb(null, 'hello', 'world');
}, function(param1, param2, cb) {
console.log(param1, ' ', param2, ' ', 'from second async function');
cb(null, 'result');
}], function(err, result) {
if(err){
console.log(err);
}
console.log(result, ' ', 'from the end function');
});
输出:
some error
hello from the end function
可以通过调整各个异步函数中的cb函数调用的参数来观察结果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。