如何打破每个循环的async.js?

如何打破每个循环的async.js?

问题描述:

嗨,我使用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

async.until直到测试返回true反复调用函数。所以测试必须返回true,以便退出循环。这与async.whilst相反,它在测试评估为真时重复运行。

async.each并行调用功能,以便返回结果是什么并不重要。它不是一个可以中断的循环,而是一个循环遍历数组的循环。您的条件停止使用async.each应该在async.until测试,你应该自己迭代规则。

是不是真的有一个“循环”这样打出来的。您的收藏在你的所有的项目都在平行

的唯一方法用于“破发”的“循环”是调用一个错误的说法回调。由于没有什么可以阻止你将其他东西放在那里,所以你可以稍微修改一下。

从文档:

。注意,因为该功能适用​​的迭代中 并行的每一项也不能保证迭代器功能将 才能完成。

即使您返回一个错误,您仍然可能有几个未完成的请求,所以您确实想限制一次使用的项目数量。要限制未完成请求的数量,可以使用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