首页 > 解决方案 > 节点 - 嵌套 For 循环异步行为

问题描述

我正在尝试从数据库创建动态 JSON,但由于节点 js 的异步行为,我无法做到这一点。

exports.wsGetDirectoryTree = function(request,response){

    pool.getConnection(function(err, connection) {
        if (err) {
            console.log("Error while connecting to DB : " + err);
            response.send(error);
            return;
        } else {

            // Org List
            objDb.wsGetOrganisationTree(connection, function(callback) {
                if(callback){
                    var data= JSON.stringify(callback);
                    var jsonObject = JSON.parse(data);
                    var count = Object.keys(jsonObject).length;                     

                    var finalResponse = '';

                    var org = '';
                    var gst = '';
                    var url = '';

                    // Org List
                    for(var i=0;i<count;i++){
                        var temp = JSON.stringify(jsonObject[i]);
                        var tempData = JSON.parse(temp);
                        (function(i){

                            // {"Apple"
                            org = '{'+'\"'+tempData.organisation_name+'\":';

                            console.log("org -> "+org);

                            // Guest list
                            objDb.wsGetGuestTree(tempData.organisation_id,connection, function(callback) {
                                if(callback){
                                    var data= JSON.stringify(callback);
                                    var jsonObject = JSON.parse(data);
                                    var count = Object.keys(jsonObject).length;                     

                                    // Guest list
                                    for(var j=0;j<count;j++){

                                        var temp = JSON.stringify(jsonObject[j]);
                                        var tempData = JSON.parse(temp);

                                        //{"Jhon":
                                        gst = '{'+'\"'+tempData.guest_name+'\":';
                                        console.log("gst = "+gst);

                                        finalResponse = org + gst;

                                                // Url list
                                                objDb.wsGetUrlTree(tempData.guest_id,connection, function(callback) {
                                                    if(callback){
                                                        var data= JSON.stringify(callback);

                                                        finalResponse = finalResponse + data;
                                                        console.log("finalResponse = "+finalResponse);
                                                        return;
                                                    } else {
                                                        return;
                                                    }
                                                });
                                    }
                                    data = data.replace('[','');
                                    data = data.replace(']','');
                                    return;
                                } else {
                                    return;
                                }
                            });

                         })(i); //function for counting
                    } //loop end

                    response.send(data);
                    return;
                } else {
                    response.send(invalidData);
                    return;
                }
            });
        }
        connection.release();
    });
};

我期待低于输出 -

{ "Organisation01": { "Guest01": { "Images": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"], "Video": ["IMG-20180117-WA0004.jpg ", "IMG-20180117-WA0004.jpg"] }, "Guest02": { "图片": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"] } }, "Organisation02" : { "Guest01": { "图片": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"] } }, "Organisation03": { "Guest01": { "图片": [ "IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"] } }, "Organisation04": { "Guest01":{“图片”:[“IMG-20180117-WA0004.jpg”,“I​​MG-20180117-WA0004.jpg”]}}}

标签: node.jsloopsasynchronous

解决方案


由于您的 for 循环计数实际上需要进行异步调用objDb.wsGetGuestTree(),因此建议使用异步模块。

请检查: https ://www.npmjs.com/package/async https://caolan.github.io/async/docs.html#eachSeries


推荐阅读