【问题标题】:Node js + multiple nested inner functions with callbackNode js +带有回调的多个嵌套内部函数
【发布时间】:2016-06-16 14:48:06
【问题描述】:

我在单个函数(abcd)中嵌套了带有回调的内部函数。

我需要使用 async 从外部调用 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 函数使用 node js 异步迭代所有对象数组。

在上面我添加了我的代码,请提出正确的方法。

【问题讨论】:

    标签: javascript node.js asynchronous callback node-async


    【解决方案1】:

    我不确定我是否理解您想要实现的具体目标,但我会试一试。

    第一个问题是您不能在内部回调函数中 return 为您的外部函数指定值(有关这方面的更多信息,请参阅 https://stackoverflow.com/a/6847754/3173842)。

    此外,您返回的是回调函数而不是结果。

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

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

    如果没有但仍需要处理动态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);
    }
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2019-02-08
      • 2018-07-03
      • 2017-12-02
      相关资源
      最近更新 更多