2013-02-18 300 views
8

嗨,我使用node.js的async模塊異步實現for循環。如何打破每個循環的async.js?

我的問題是:如何打破循環執行,並得到了循環?我試過returnreturn false但沒有運氣。

下面是示例代碼:

async.until( 

    function() { return goal; }, 

    function(callback) { 

     async.each(_rules, 

      function(rule,callback) { 

       var outcome = true; 
       .... some code .... 
       if(changes){ 
         console.log("hi"); 
         return false;// HERE I NEED TO BREAK 
       } 
       else 
       callback(); 

      }, 

      function(err){ } 
     ); 

     if (!changes || session.process)     
      goal = true; 

     callback(); 
    }, 

    function(err){ callback(session); }  
); 
+3

您可以在回調的第一個參數發送的東西(這'async'將解釋爲打破一個「錯誤」並停止循環)。將它作爲一個已知值(a * truthy * one),您可以在最終回調中檢查它是否是中斷而不是錯誤。 – Chad 2013-02-18 14:54:54

+0

你能告訴我如何在這裏做到這一點?我不能在'return false'的地方調用'callback(1)''我在代碼中顯示並打破它的行 – mithunsatheesh 2013-02-18 15:11:21

+0

如果你沒有在所有路徑中調用回調,那麼循環永遠不會「結束」。如果你有一條路徑沒有調用回調,那麼你做錯了。這是異步的,你的返回值什麼也不做。 – Chad 2013-02-18 15:21:08

回答

5

async.until直到測試返回true反覆調用函數。所以測試必須返回true,以便退出循環。這與async.whilst相反,它在測試評估爲真時重複運行。

async.each並行調用功能,以便返回結果是什麼並不重要。它不是一個可以中斷的循環,而是一個循環遍歷數組的循環。您的條件停止使用async.each應該在async.until測試,你應該自己迭代規則。

5

是不是真的有一個「循環」這樣打出來的。您的收藏在你的所有的項目都在平行

的唯一方法用於「破發」的「循環」是調用一個錯誤的說法回調。由於沒有什麼可以阻止你將其他東西放在那裏,所以你可以稍微修改一下。

從文檔:

。注意,因爲該功能適用​​的迭代中 並行的每一項也不能保證迭代器功能將 才能完成。

即使您返回一個錯誤,您仍然可能有幾個未完成的請求,所以您確實想限制一次使用的項目數量。要限制未完成請求的數量,可以使用eachSeries或eachLimit。

例如:

async.each(_rules, 
     function(rule,callback) { 
      if(changes){      
        return callback({ data: 'hi'}); // stop 
      } 
      ... 
      if(realerror){ 
       return callback({ error: realerror}); // stop with an error 
      } 
      callback(); // continue 
     }, 

     function(result){ 
      if(!result){ 
      return othercallback('no results'); 
      } 
      // check if we have a real error: 
      if(result.error){ 
      return othercallback(result.error); 
      } 
      return othercallback(null, result.data); 
     } 
    ); 

PS:如果你不這樣做異步,使用underscore

+0

你能告訴我如何在這裏做到這一點?我不能在'return false'的地方調用'callback(1)''我已經在代碼中顯示並打破它的行 – mithunsatheesh 2013-02-18 15:10:43

+0

@mithunsatheesh簡短的回答:你必須,而且你可以。 – Chad 2013-02-18 15:21:26

+1

而不是返回false,只需執行「return callback({data:false})」並檢查最終回調中的第一個參數。 – AndyD 2013-02-25 04:11:53