2014-04-09 97 views
1

那麼問題很簡單,我在for循環中使用查詢,並且如果我得到的計數小於15,我想離開for循環,否則增加分配的。但是我無法使用break語句,並且循環將在第一次回調之後繼續執行。如何擺脫nodejs中的for循環

for (var i = 0; i < test; i++) { 

       var sql = "SELECT count(*) as count FROM `tb_members` WHERE `assigned`=?"; 
       connection.query(sql, [assigned], function (err, response) { 

        if (response[0].count < 15) { 

         callback(assigned); 

        } 
        else { 
         ++assigned; 

         if (i == test - 1) { 
          callback(0); 
         } 
        } 
       }); 
      } 

回答

4

您的代碼寫入的方式,您的所有SQL查詢將立即開始。然後,稍後,查詢將開始返回結果。因此,您無法跳出for循環,因爲它已完成並且所有SQL查詢都已發送完畢。

如果您想根據前一個結果決定是否發送下一個查詢,則必須一次只發送一個查詢,並且由於結果的異步性質,不能使用for循環爲了那個原因。發送查詢一次一個,然後決定是否發送下一個

一種方法是這樣的:

function sendQueries() { 
    var i = 0; 

    function next() { 
     if (i < test) { 
      var sql = "SELECT count(*) as count FROM `tb_members` WHERE `assigned`=?"; 
      connection.query(sql, [assigned], function (err, response) { 
       i++; 
       if (response[0].count < 15) { 
        callback(assigned); 
       } else { 
        ++assigned; 
        if (i == test - 1) { 
         callback(0); 
        } 
       } 
       // here you can decide whether you want to do the next iteration 
       // or not by either calling next() or not. 
       next(); 
      }); 
     } 
    } 
    next(); 
} 
0

您應該使用異步寫這樣的循環。如果你想要一個串行行爲 - 你可能會考慮使用async.eachSeries,然後你可以通過調用具有錯誤的回調函數來停止循環。此時循環將不再執行。但在錯誤處理程序中 - 忽略錯誤。

看看這裏:https://github.com/caolan/async#collections