2017-05-29 25 views
0

嘗試從內部循環獲取數據,但得到延遲。越來越晚的響應內部循環nodejs

在代碼中,我從祖先的SQL表中獲取用戶列表。我需要這些祖先檢查它們的根值(層次結構/樹結構)。如果祖先角色是銷售經理,則爲每個用戶添加銷售經理名稱。

爲例,其是不工作:

如果用戶本身是父,值推入數組。 (WORKS)

如果用戶有父項(如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 
    } 
}) 
+0

的可能的複製[如何返回從響應異步調用?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – GilZ

回答

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