Node.js异步模块瀑布 - 动态加载和执行函数

时间:2014-08-01 23:54:28

标签: javascript node.js asynchronous waterfall

我试图动态加载一系列匿名函数并执行它们,将前一个结果传递给下一个函数。

这是一个示例函数:

module.exports = function (data) {
    // do something with data
    return (data);
}

当加载函数时(它们都位于不同的文件中),它们作为对象返回:

{ bar: [Function], foo: [Function] }

我想使用async.waterfall执行这些函数。这需要一组函数,而不是函数的对象,所以我转换如下:

var arr =[];
        for( var i in self.plugins ) {
            if (self.plugins.hasOwnProperty(i)){
                arr.push(self.plugins[i]);
            }
        }

这给出了:

[ [Function], [Function] ]

现在我如何使用每个async.waterfall执行每个函数,将前一个函数的结果传递给下一个函数?


感谢@piergiaj的评论,我现在在函数中使用next()。最后一步是确保将预定义函数放在可以传递传入数据的数组中的第一个:

var arr =[];

    arr.push(function (next) {
        next(null, incomingData);
    });

    for( var i in self.plugins ) {
        if (self.plugins.hasOwnProperty(i)){
            arr.push(self.plugins[i]);
        }
    }

    async.waterfall(arr,done);

1 个答案:

答案 0 :(得分:1)

如果您希望它们使用async.waterfall将数据传递给下一个,而不是在每个函数的末尾返回,则需要调用next()方法。此外,您需要让next成为每个函数的最后一个参数。例如:

module.exports function(data, next){
    next(null, data);
}

next的第一个参数必须为null,因为async.waterfall将其视为错误(如果您在其中一个方法中遇到错误,请将其传递给async.waterfall将停止执行并完成将错误传递给最后的方法)。

然后你可以将它转换为(对象到数组),然后像这样调用它:

async.waterfall(arrayOfFunctions, function (err, result) {
     // err is the error pass from the methods (null if no error)
     // result is the final value passed from the last method run    
  });