I'm trying to call a group of asynchronous functions identified by parameters.
Example: callFunctions("A,C"); would call both objFns["A"] and objFns["C"].
The problem I have run into is that arrayParams[i] is resolved when the internal function is finally called by async.parallel(). This means that i == arrayParams.length which of course crashes since objFns[arrayParams.length] is undefined. Help pointing me in the right direction would be appreciated.
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) {...});
}
You can use anonymous function to make copy of i on each iteration.
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']);
If you don't need to change functions behaviour you can simple copy functions to array without outer function.
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']);
As far as i can tell, what you are pushing onto arrayFns is a function which directly calls another function with the same parameters, is there any reason why this should not work:
function callFunctions(arrayParam)
{
var i,arrayFns = [];
for (i = 0; i < arrayParams.length; i++)
{
arrayFns.push(objFns[arrayParams[i]]);
}
async.parallel(arrayFns,function(error) {...});
}