节点js +带有回调的多个嵌套内部函数

RSK*_*KMR 7 javascript asynchronous callback node.js node-async

我在单个函数(abcd)中使用回调嵌套了内部函数.

我需要使用异步从外部调用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;
                    });
                });
            });
        });
    });
};
Run Code Online (Sandbox Code Playgroud)

数组中的数据对象

 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
    });
}
Run Code Online (Sandbox Code Playgroud)

需要使用initalFunction函数使用节点js异步迭代所有对象数组.

在上面我添加了我的代码,请建议正确的方法.

小智 0

我不确定我是否理解您到底想要实现什么,但我会尝试一下。

第一个问题是您无法return在内部回调函数中为外部函数提供值(有关此问题的更多信息,请参阅/sf/answers/479342811/ )。

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

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

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);
});
Run Code Online (Sandbox Code Playgroud)

现在让我们使用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);
});
Run Code Online (Sandbox Code Playgroud)

如果可以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);
});
Run Code Online (Sandbox Code Playgroud)

如果没有但仍然需要处理动态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);
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。