var async=require('async');
var log=console.log;
var callback=function (err,args){
args++;
log("args:"+args);
}
async.waterfall([
function(callback){
log("start");
callback(null,100);
},
function(err, callback){
log( err);
callback(null , 200);
},
function(err, callback){
log( err);
callback(null, 300);
}
], function (err, result) {
// result now equals 'done'
log(result);
log("done");
});
9 回复
改了一下
var async=require('async');
var log=console.log;
var inc=function (args,callback){
args++;
callback(null, args);
log("inc args:"+args);
}
async.waterfall([function(callback){
log("start");
callback(null,100);
},
function(args, callback){
log( args);
inc(args, callback);
},
function(args, callback){
log( args);
inc(args, callback);
}
], function (err, result) {
log("err:"+err);
log("result:"+result);
log("done");
});
貌似这里面的callback不是一个实际的函数,只是一个占位符一样的东西,根据执行结果看,好象最终的那个function (err, result)执行以后,inc还会执行一次,是waterfall本来是这样,还是代码有问题?
@yakczh 顺序没错,如果想inc args:102
打印在前,必须在callback之前,最后的fuction(err, result)...
内的打印语句并不是异步执行,所以在这个function执行完成后才打印。
async.waterfall = function (tasks, callback) {
callback = callback || function () {};
if (!_isArray(tasks)) {
var err = new Error('First argument to waterfall must be an array of functions');
return callback(err);
}
if (!tasks.length) {
return callback();
}
var wrapIterator = function (iterator) {
return function (err) {
if (err) {
callback.apply(null, arguments);
callback = function () {};
}
else {
var args = Array.prototype.slice.call(arguments, 1);
var next = iterator.next();
if (next) {
args.push(wrapIterator(next));
}
else {
args.push(callback);
}
async.setImmediate(function () {
iterator.apply(null, args);
});
}
};
};
wrapIterator(async.iterator(tasks))();
};
这是async.waterfall源码,并没有异步调用callback.