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

mit*_*esh 9 javascript loops callback node.js

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

我的问题是:如何打破循环执行并退出循环?我试过给return,return 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); }     
);
Run Code Online (Sandbox Code Playgroud)

use*_*109 6

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

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


And*_*dyD 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);
        }
    );
Run Code Online (Sandbox Code Playgroud)

PS:如果你没有做异步,请使用下划线