【问题标题】:Break out of async completely if condition met如果条件满足,则完全脱离异步
【发布时间】:2016-10-14 07:59:03
【问题描述】:

如何使 async.each 循环中断并在满足条件时返回特定值/错误。例如,在这种情况下,如果状态存在,我希望从函数“检查”返回一些内容,而不是遍历其余项目。有什么建议吗?

const check = (condition) => {

    if (condition === 100) {

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

               if (status) {

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

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

【问题讨论】:

  • check 函数中需要有回调参数,这样才能用 hapi 的 handler 回复。

标签: javascript node.js hapijs


【解决方案1】:

这看起来像是这个问题的重复:

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
         }
      });

【讨论】:

  • 很高兴听到这个消息!请将此标记为答案,以便其他人也可以使用它。我将继续在此处添加其他问题的解决方案,因为它与该问题略有不同。
【解决方案2】:

由于 async.each 对 items 数组中的每个项目并行工作。看起来不可能在任何条件下停止操作,因为这里项目的执行顺序不是确定的。我想您应该改用 async.eachSeries 。

因此,只要满足条件,您应该做的是抛出错误(return callback(err)),这将做的是它将停止进一步执行。如果你想发送一些值而不是抛出和错误,你可以假装发送一个错误,在检查 async.eachSeries 的主回调时,你只需检查你从 iteratee 回调函数中获得的值的类型可以看例如:

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, //...);
});

告诉我它是否有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2018-12-21
    • 2017-01-13
    相关资源
    最近更新 更多