2016-06-13 33 views
-1

如何在滿足條件時使async.each循環中斷並返回特定值/錯誤。例如,在這種情況下,如果狀態存在,我希望從函數'check'返回某些內容,而不是遍歷剩餘的項目。有什麼建議麼?如果條件滿足,則完全中斷異步

const check = (condition) => { 

    if (condition === 100) { 

      async.each(items, (item, callback) => { 

       if (status) { 

        callback(Boom.conflict('Conflict')); 
       } else { 

        // some logic 
        callback(destroyInstance); 
       } 
      }); 
    } 
}; 
+0

您需要在check函數中有一個回調參數,以便您可以使用hapi的處理程序進行回覆。 –

回答

0

這看起來像這個問題的重複:

Break out of javascript nested async.each loop but continue main loop

退房答案,它應該幫助你。在這種情況下,它是另一個異步循環內嵌套異步,但答案仍然應該工作。

編輯:

的溶液,如在該線程但沒有額外的層表示,如下:

async.each(subArray, function(item, callback) { 
     if (SOME_CONDITION) { 
     // Break out of async 
     var err = new Error('Broke out of async'); 
     err.break = true; 
     return callback(err); 
     } 
     // continue 
     callback(); 

     }, function(err) { 
     if (err && err.break) { 
      // Handle break out of async here 
     } else { 
      // Otherwise handle here 
     } 
     }); 
+0

謝謝,它的工作 –

+0

很高興聽到它!請將此標記爲答案,以便其他人也可以使用它。我會繼續在這裏添加來自其他問題的解決方案,因爲它與該問題略有不同。 – Sam

0

作爲async.each工作平行於項目陣列的每個項目。它看起來不可能在任何情況下停止操作,因爲這裏的項目執行順序不是確定性的。我想你應該使用async.eachSeries。

所以無論什麼時候符合條件你應該做的就是拋出一個錯誤(return callback(err)),這樣做將會停止進一步執行。如果你想發送一些值而不是拋出和錯誤,你可以假裝發送一個錯誤,並檢查async.eachSeries的主回調,你只需檢查你從iteratee回調函數得到的值的類型爲u可以看到,例如:

async.eachSeries(items, function iteratee(item, callback) { 
    if (status) { 
    return callback(E/V); // error(E) or value(V) u want to send to the done function 
    } else { 
    // some logic 
    callback(); 
    } 
}, function done(e) { 
    if(e){ 
    if(type of e === TYPE OF RETURN VALUE U WANTED) // or any other logic u can come up with 
    return cb(null, e); 
    else return cb(e); 
    } 
    else cb(null, //...); 
}); 

告訴我,如果它的工作。

+0

是的,這工作。謝謝 –