节点js +多个嵌套的内部函数与callback

我已经与单一函数(abcd)中的callback嵌套内部函数。

我需要使用asynchronous从外部调用abcd函数并返回响应。

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; }); }); }); }); }); }; 

数组中的数据对象

  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 }); } 

需要使用initalFunction函数使用节点jsasynchronous迭代所有对象数组。

在上面我加了我的代码,请build议正确的方法。

我不确定我是否明白你到底想要达到什么目的,但我会试一试。

第一个问题是你不能在一个内部callback函数中为你的外部函数return一个值(参见https://stackoverflow.com/a/6847754/3173842了解更多信息)。

此外,您正在返回callback函数而不是结果。

这是我认为你真的想要做的事情:

 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); }); 

现在让我们使用async.seqasync.map来简化这个:

 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); }); 

如果你可以改变listFunctions从一个对象到数组:

 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); }); 

如果不是,但仍然需要处理dynamiclistFunctions

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

我希望这有帮助。