对内循环nodejs

时间:2017-05-29 10:49:29

标签: javascript arrays node.js loops

尝试从内循环中获取数据,但是要延迟。

在代码中,我从sql表中获取用户列表及其祖先。我需要这些祖先来检查它们的根值(层次结构/树结构)。如果祖先角色是salesmanager,则为每个用户添加salesmanager名称。

不起作用的案例

  

如果用户本身是父级,则值会推送到数组中。 (工程)

     

如果用户有父(如user_id 3由user_id 2添加,2由1添加),则1为3的祖先。进入内循环。

     

值推送到同一个数组,如果在此数组中打印则显示,但如果在循环外打印则不显示

以下是代码:

var sql_query='SELECT *,GetAncestry(id) as anstry FROM users'  //get ancestors using sql function
con.query(sql_query, function(err,rows) {
    if(err) throw err;
    if(rows) {
        console.log('length rows'+rows.length) // prints 5
        var rows_salesinfo=[]
        var ancestors=[]
        rows.forEach(function(rows) {
            if(rows.anstry !='') {
                var array = JSON.parse("[" + rows.anstry + "]");
            } else {
                var array = []
            }
            if(array.length > 0) {
                // inner loop starts
                con.query('SELECT id,role,firstname,lastname FROM users WHERE users.id IN ('+array+')', function(demoErr,demoRows) {
                    if(demoErr) throw demoErr;
                    if(demoRows.length > 0) {
                        var keepGoing = true;
                        demoRows.forEach(function(index,value,callback) {
                            if(keepGoing) {
                                if(index.role == 'sales_manager') {
                                    console.log(rows.id)
                                    rows.salesmanager = index.firstname+" "+index.lastname
                                    rows_salesinfo.push(rows)
                                    keepGoing = false;
                                }
                            }
                            console.log(rows_salesinfo) // this inner loop values print here
                        })
                    } else {
                        rows_salesinfo.push(rows)
                    }
                })
            } else {
                console.log(rows.id) // works
                rows.salesmanager=''
                rows_salesinfo.push(rows) // works
            }
        })
        console.log('6new')
        console.log(rows_salesinfo) // works before response of inner loop
        console.log('length rows_salesinfo'+rows_salesinfo.length) // length 3 
    }
})

1 个答案:

答案 0 :(得分:0)

你的内部循环是回调函数。因此,只有在db级别执行con.query并返回结果后才会执行它。 .query是异步函数。您可以阅读有关回调和node.js事件循环here的信息。基本上,查询命令看起来像这样“嘿,db,请执行此命令,告诉我,结果准备就绪。之后我将执行我的回调函数。”当db运行您的查询时,javascript命令继续执行。 如果您希望在所有查询准备就绪后执行上一个日志,我建议您查看async.each函数。

所以,你的代码看起来像这样

async.each(rows, 
           function(row, callback) {
               // Perform operation on row that you need
               //run innex query and inner loop
               con.query('some query', function(demoErr,demoRows) {
                   if(demoErr) callback(demoErr); //error will apear in final function
                   //demo rows foreach and if here
                   callback(); //execute callback without args to show that this function is finished
               });
           }, 
           function(err) {
               //check for err here 
               //and do final logs
               console.log('6new')
               console.log(rows_salesinfo)
               console.log('length rows_salesinfo'+rows_salesinfo.length) 
           });

您需要运行

npm install --save async
项目目录中的