CNode

waterfall中的callback为什么没有执行?

问答
Yyakczh发布于12 年前最后回复12 年前9 回复5273 浏览0 收藏

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)

L
leapon#1·12 年前

带 err 参数的函数只有最终的那个 顶这个答案

Y
yakczh#2·12 年前

改了一下

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改了一下 貌似这里面的callback不是一个实际的函数,只是一个占位符一样的东西,根据执行结果看,好象最终的那个function (err, result)执行以后,inc还会执行一次,是w...

@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.

A
alsotang#8·12 年前

看不懂你的代码。 外层的 callback 会被覆盖掉的,在 waterfall 里面的 function 中,都读不到。

A
alsotang#9·12 年前

而且你这个 waterfall 的用法跟官方的例子完全不同啊。官方没有那么多的 function (err, callback),带 err 参数的函数只有最终的那个。

参与回复
登录后即可参与回复。登录