2015-10-02 31 views
0

MySQL查詢我的代碼,這樣的結構:Node.js的 - 裏面的foreach

connection.query(query1,function(err,rows) { 
    var response = []; 
    //doing something with rows 
    rows.forEach(function(item) { 
     connection.query(queryItem,function(err,rows) { 
      //doing something 
      result = rows[0].field; 
      //and want to push it to an array 
      response.push(result); 
     }); 
    }); 
    console.log(response); //empty 
}); 

我知道的forEach阻止,但查詢是非阻塞。我試圖用承諾:

connection.query(query1,function(err,rows) { 
    var response = []; 
    //doing something with rows 
    rows.forEach(function(item) { 
     var promise = new Promise(function(resolve,reject) { 
      connection.query(queryItem,function(err,rows) { 
       //doing something 
       result = rows[0].field; 
       //and want to push it to an array 
       resolve(result); 
      }); 
     }); 
     promise.then(function(result) { 
      console.log(result); //ok 
      response.push(result) //not ok, result is empty 
     }); 
    }); 
    console.log(response); //empty 
}); 

但它沒有幫助。我如何從非阻塞函數中將值推入數組並在之後使用它?

+0

這是天生的諾言還是藍鳥? – Selfish

+0

我是節點中的新手。要求( '承諾');可能是本機的,我不知道=) –

回答

2

創建承諾是朝着正確方向邁出的一步,但您需要進一步將承諾彙總到數組並傳遞給Promise.all,然後等待它們全部完成,然後嘗試訪問response

connection.query(query1,function(err,rows) { 
    var response = []; 
    //doing something with rows 
    Promise.all(rows.map(function(item) { 
     var promise = new Promise(function(resolve,reject) { 
      connection.query(queryItem,function(err,rows) { 
       //doing something 
       result = rows[0].field; 
       //and want to push it to an array 
       resolve(result); 
      }); 
     }); 
     return promise.then(function(result) { 
      console.log(result); //ok 
      response.push(result) //ok 
     }); 
    }).then(function() { 
     console.log(response); //not empty 
    }); 
}); 
+1

請注意,這導致在同一時間向您的數據庫發送n個查詢,它可能會更好地將它們全部組合成單個事務,這也將消除對promise的需要在這種情況下。不管這是否是SELECT語句,在這種情況下,您可能只需製作一個查詢即可獲取數據,然後逐個分組。在像這樣的循環中發送查詢在性能方面通常是一個糟糕的主意。 –

+0

這是工作!但是如果我在Promise.all外面做「console.log」,這是空的。這是否意味着我必須將我的下一個代碼放入諾言中。或者有什麼辦法? –

+0

並感謝您提供有關複雜SELECT查詢的建議。我會試試看。 –