如何将函数数组作为参数传递给另一个函数,并在后面的函数中调用这些函数

时间:2014-12-28 07:41:24

标签: javascript node.js asynchronous

最近我使用async来控制工作流程。我想异步执行一组函数。使用节点模块async。 以下是我的代码

var async = require('async')
var resArray = [],
    exeFunction = []
var addOne = function (num) {
    resArray.push(10)
}
for(var i = 0; i < 10; i++){
    exeFunction.push(addOne(num))
}

async.waterfall(exeFunction,function () {
    console.log(resArray)
})

它没有用。(原谅我的愚蠢) 当我改变这样的代码时:

var async = require('async')
var resArray = []
var exeFunction = []
var addOne = function () {
    resArray.push(10)
}
for(var i = 0; i < 10; i++){
    exeFunction.push(addOne)
}

async.waterfall(exeFunction,function () {
    console.log(resArray)
})

它仍然无法运作。 这是错误的?如何解决?

我是nodejs的新手,任何建议都会非常好。谢谢!

PS:迭代器的常规在这种情况下运行良好。但我想知道如何以这种方式使用async

3 个答案:

答案 0 :(得分:0)

试试这个:

var c1=function(){  // Create First Element of array of functions
  alert("In C1");
}
var c2=function(){ // Create Second Element of array of functions
  alert("In C2");
}
var childs=[c1,c2]; // Create array of functions
function parentfunc(funcs){ // Create a function which will invoke array of functions
  alert("In Parent");
  for(var i=0;i<funcs.length;i++){ 
    if(typeof(funcs[i])=="function"){ // Invoke a function from array of functions
      funcs[i]();
    }
  }
}
parentfunc(childs); // Invoke function which will invoke array of functions

答案 1 :(得分:0)

我想你想这样做:

var async = require('async')

var resArray = [],
    exeFunction = [
        function(callback) {
            callback(null, 0)
        }
    ]
;
var addOne = function(num, callback) {
    resArray.push(num)
    callback(++num)
}

for(var i = 0; i < 10; i++){
    exeFunction.push(addOne)
}

async.waterfall(exeFunction, function() {
    console.log(resArray)
})

您的错误是,当您想要自己提供函数时,您将返回函数addDone(此处为undefined)。

答案 2 :(得分:0)

您需要添加callback功能才能转到to the next task,就像这样

var async       = require('async');
var exeFunction = [];
var resArray    = [];

var addOne = function (num) {
    return function (next) {
      resArray.push(10); // or resArray.push(num)
      next(null);
    }
}

for (var i = 0; i < 10; i++) {
  exeFunction.push(addOne(i));
}

async.waterfall(exeFunction, function (err, res) {
    console.log(resArray)
})