9

嗨,我正在使用node.js 的异步模块来异步实现 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); }     
);
4

2 回答 2

7

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

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

于 2013-02-18T14:57:28.910 回答
5

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

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

从文档:

请注意,由于此函数将迭代器并行应用于每个项目,因此无法保证迭代器函数将按顺序完成。

即使您返回错误,您仍然可能有几个未完成的请求,因此您真的想限制一次性使用的项目数量。要限制未完成请求的数量,您可以使用 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:如果你不做异步,使用下划线

于 2013-02-18T15:06:10.933 回答