2016-06-13 35 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

是的,这工作。谢谢 –