我正在尝试动态加载一系列匿名函数并执行它们,将前一个函数的结果传递给下一个。
下面是一个函数示例: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] ]
我现在如何使用每个异步执行每个函数。瀑布传递前一个函数的结果到下一个?
<
解决方案/strong>
感谢@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);
如果您希望它们使用async将数据传递给下一个。瀑布式,不是在每个函数结束时返回,而是需要调用next()方法。此外,您需要将next作为每个函数的最后一个参数。例子:
module.exports function(data, next){
next(null, data);
}
next的第一个参数必须为空,因为async。Waterfall将其视为错误(如果你在其中一个方法中遇到错误,将其传递给异步方法)。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
});