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

时间:2013-02-18 14:52:04

标签: javascript node.js loops callback

您好我正在使用node.js的async模块来异步实现for循环。

我的问题是:如何打破循环执行并退出循环?我尝试过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); }     
);

2 个答案:

答案 0 :(得分:6)

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

async.each并行调用函数,因此返回的函数无关紧要。它不是一个可以中断的循环,而是循环遍历数组的迭代器。您停止使用async.until的条件应该是{{1}}的测试,您应该自己重复规则。

答案 1 :(得分:6)

没有真正的“循环”可以突破。您的收藏中的所有商品都是并行使用的

“打破”“循环”的唯一方法是使用错误参数调用回调。因为没有什么可以阻止你把其他东西放在那里你可以稍微破解它。

来自文档:

  

注意,因为此函数将迭代器应用于每个项目   并行,不能保证迭代器函数会   按顺序完成。

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