Node js + many nested inner functions with callback

I have nested inner functions with a callback that are in the same function (abcd).

I need to call the abcd function from outside using async and return a response.

var listFunctions = { test1 : function(objectData, callbackData) { //have logic and retrun data callbackData(null, "a"); }, test2 : function(objectData, callbackData) { //have logic and retrun data callbackData(null, "b"); }, test3 : function(objectData, callbackData) { //have logic and retrun data callbackData(null, "c"); }, test4 : function(objectData, callbackData) { //have logic and retrun data callbackData(null, "d"); }, test5 : function(objectData, callbackData) { //have logic and retrun data callbackData(null, "e"); } }; function abcd(objectData, clb) { listFunctions.test1(objectData, function(err, data1) { listFunctions.test1(data1, function(err, data2) { listFunctions.test1(data2, function(err, data3) { listFunctions.test1(data3, function(err, data4) { listFunctions.test1(data4, function(err, data5) { return clb; }); }); }); }); }); }; 

data object in array

  var objectData = [{"id":1, "name" : "abcd"},{"id":2, "name" : "abc2d"},{"id":3, "name" : "3abcd"},{"id":4, "name" : "4abcd"}]; initalFunction(objectData, function(response) { console.log(response); }); function initalFunction(objectData, result) { async.each(objectData, function(dataValues, callback) { abcd(dataValues, function(response) { console.log(response); }); }, function(err) { return result; //Need to re }); } 

Iterate over the entire array of objects using node js async using the initalFunction function.

In the section above, I added my code, please suggest the correct path.

+6
source share
1 answer

I'm not sure if I understood what exactly you are trying to achieve, but I will try.

The first problem is that you cannot return value for your external function inside the internal callback function (see fooobar.com/questions/21485 / ... for more information on this).

In addition, you return a callback function, not a result.

This is what I think you really wanted to do:

 var async = require("async"); var listFunctions = { test1: function(objectData, callbackData) { objectData.name += ":a"; callbackData(null, objectData); }, test2: function(objectData, callbackData) { objectData.name += ":b"; objectData.foo = "bar"; callbackData(null, objectData); }, test3: function(objectData, callbackData) { objectData.name += ":c"; callbackData(null, objectData); }, test4: function(objectData, callbackData) { objectData.name += ":d"; callbackData(null, objectData); }, test5: function(objectData, callbackData) { objectData.name += ":e"; callbackData(null, objectData); } }; function abcd(objectData, cb) { listFunctions.test1(objectData, function(err, data1) { listFunctions.test2(data1, function(err, data2) { listFunctions.test3(data2, function(err, data3) { listFunctions.test4(data3, function(err, data4) { listFunctions.test5(data4, function(err, data5) { cb(err, data5); }); }); }); }); }); } function initalFunction(objectData, cb) { var results = []; async.each(objectData, function(dataValues, done) { abcd(dataValues, function(err, response) { results.push(response); done(); }); }, function(err) { cb(err, results); }); } var objectData = [{id:1,name:"abcd"},{id:2,name:"abc2d"},{id:3,name:"3abcd"},{id:4,name:"4abcd"}]; initalFunction(objectData, function(err, response) { if (err) { console.log(err.stack); return; } console.log("Result:", response); }); 

Now you can use async.seq and async.map to simplify:

 var async = require("async"); var listFunctions = { test1: function(objectData, callbackData) { objectData.name += ":a"; callbackData(null, objectData); }, test2: function(objectData, callbackData) { objectData.name += ":b"; objectData.foo = "bar"; callbackData(null, objectData); }, test3: function(objectData, callbackData) { objectData.name += ":c"; callbackData(null, objectData); }, test4: function(objectData, callbackData) { objectData.name += ":d"; callbackData(null, objectData); }, test5: function(objectData, callbackData) { objectData.name += ":e"; callbackData(null, objectData); } }; var abcd=async.seq.apply(null, [ listFunctions.test1, listFunctions.test2, listFunctions.test3, listFunctions.test4, listFunctions.test5 ]); function initialFunction(objectData, cb) { async.map(objectData, abcd, cb); } var objectData = [{id:1,name:"abcd"},{id:2,name:"abc2d"},{id:3,name:"3abcd"},{id:4,name:"4abcd"}]; initialFunction(objectData, function(err, response) { if (err) { console.log(err.stack); return; } console.log("Result:", response); }); 

If you can change listFunctions from an object to an array:

 var async = require("async"); var listFunctions = [ function test1(objectData, callbackData) { objectData.name += ":a"; callbackData(null, objectData); }, function test2(objectData, callbackData) { objectData.name += ":b"; objectData.foo = "bar"; callbackData(null, objectData); }, function test3(objectData, callbackData) { objectData.name += ":c"; callbackData(null, objectData); }, function test4(objectData, callbackData) { objectData.name += ":d"; callbackData(null, objectData); }, function test5(objectData, callbackData) { objectData.name += ":e"; callbackData(null, objectData); } ]; function initialFunction(objectData, cb) { async.map(objectData, async.seq.apply(null, listFunctions), cb); } var objectData = [{id:1,name:"abcd"},{id:2,name:"abc2d"},{id:3,name:"3abcd"},{id:4,name:"4abcd"}]; initialFunction(objectData, function(err, response) { if (err) { return console.error(err.stack); } console.log("Result:", response); }); 

if not, but still need to handle dynamic listFunctions :

 function initialFunction(objectData, cb) { var list = Object.keys(listFunctions).map(function(name) { return listFunctions[name]; }); async.map(objectData, async.seq.apply(null, list), cb); } 

Hope this helps.

0
source

All Articles