节点-嵌套的For循环异步行为 [英] Node - Nested For loop async behaviour

查看:126
本文介绍了节点-嵌套的For循环异步行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to create Dynamic JSON from database but due to async behaviour of node js I am not able to do that.

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":{ 图像":["IMG-20180117-WA0004.jpg","IMG-20180117-WA0004.jpg"], 视频":["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","IMG-20180117-WA0004.jpg"] }}}

{ "Organisation01": { "Guest01": { "Images": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"], "Video": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"] }, "Guest02": { "Images": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"] } }, "Organisation02": { "Guest01": { "Images": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"] } }, "Organisation03": { "Guest01": { "Images": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"] } }, "Organisation04": { "Guest01": { "Images": ["IMG-20180117-WA0004.jpg", "IMG-20180117-WA0004.jpg"] } } }

推荐答案

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

Since your for loop over count actually requires to make async calls objDb.wsGetGuestTree() , it would be advisable to use async module.

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

这篇关于节点-嵌套的For循环异步行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆