如果满足条件,则完全打破异步

时间:2016-06-13 19:20:03

标签: javascript node.js hapijs

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

<View style={styles.container}>
    <ScrollView style={{ flex: 1 }} removeClippedSubviews={true}>
      <View style={{ height: 500, width: 350, marginBottom: 15, backgroundColor: 'cyan' }}>
        <ViewPagerAndroid style={{ flex: 1 }}>
          <View><Text style={{ fontSize: 30 }}>{'Page1'}</Text></View>
          <View><Text style={{ fontSize: 30 }}>{'Page2'}</Text></View>
        </ViewPagerAndroid>
      </View>
      <View style={{ height: 500, width: 350, marginBottom: 15, backgroundColor: 'lightblue' }}>
        <ViewPagerAndroid style={{ flex: 1 }}>
          <View><Text style={{ fontSize: 30 }}>{'Page1'}</Text></View>
          <View><Text style={{ fontSize: 30 }}>{'Page2'}</Text></View>
        </ViewPagerAndroid>
      </View>
    </ScrollView>
  </View>

2 个答案:

答案 0 :(得分: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
         }
      });

答案 1 :(得分:0)

async.each对items数组中的每个项目并行工作。看起来不可能在任何条件下停止动作,因为这里的项目执行顺序不确定。我想你应该使用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, //...);
});

告诉我它是否有效。