调用由key标识的异步函数

时间:2013-03-31 22:32:48

标签: javascript arrays node.js function asynchronous

我正在尝试调用一组由参数标识的异步函数。

示例: callFunctions("A,C");会同时调用objFns["A"]objFns["C"]

我遇到的问题是arrayParams[i]async.parallel()最终调用内部函数时得到解决。这意味着自i == arrayParams.length以来崩溃的objFns[arrayParams.length]未定义。帮助我指出正确的方向将不胜感激。

objFns = {};
objFns["A"] = function (callback) {...}
objFns["B"] = function (callback) {...}
objFns["C"] = function (callback) {...}

function callFunctions(arrayParam) {
    var i, arrayFns = [];

    for (i = 0; i < arrayParams.length; i++) {
        arrayFns.push(function (callback) {
            objFns[arrayParams[i]](callback);
        }
    }

    async.parallel(arrayFns, function (error) {...});
}

2 个答案:

答案 0 :(得分:1)

您可以使用匿名函数在每次迭代时复制i

var async = require('async');

objFns = {};
objFns["A"] = function (callback) {callback();};
objFns["B"] = function (callback) {callback();};
objFns["C"] = function (callback) {callback();};

function callFunctions(arrayParams) {
  var i,arrayFns = [];

  for (i = 0; i < arrayParams.length; i++) {
    (function (i) {
      arrayFns.push(function (callback) {
        objFns[arrayParams[i]](callback);
      });
    })(i);
  }

  async.parallel(arrayFns,function(error) {
  });
}

callFunctions(['A', 'B']);

如果您不需要更改函数行为,则可以简单地将函数复制到数组而无需外部函数。

var async = require('async');

objFns = {};
objFns["A"] = function (callback) {callback();};
objFns["B"] = function (callback) {callback();};
objFns["C"] = function (callback) {callback();};

function callFunctions(arrayParams) {
  var i,arrayFns = [];

  for (i = 0; i < arrayParams.length; i++) {
    arrayFns.push(objFns[arrayParams[i]]);
  }

  async.parallel(arrayFns,function(error) {
  });
}

callFunctions(['A', 'B']);

答案 1 :(得分:1)

据我所知,你推到arrayFns上的是一个直接调用具有相同参数的另一个函数的函数,有什么理由不适用:

function callFunctions(arrayParam)
{
  var i,arrayFns = [];

  for (i = 0; i < arrayParams.length; i++)
  {
    arrayFns.push(objFns[arrayParams[i]]);
  }

  async.parallel(arrayFns,function(error) {...});
}