【问题标题】:how to break async.js each loop?如何打破 async.js 每个循环?
【发布时间】:2013-02-18 14:52:04
【问题描述】:

您好,我正在使用 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); }     
);

【问题讨论】:

  • 您可以通过在回调的第一个参数中发送一些内容来中断(async 将解释为“错误”并停止循环)。将其设为一个已知值(真实),您可以在最终回调中检查它以了解它是中断而不是错误。
  • 你能告诉我怎么做吗?我不能在代码中显示的return false; 行的位置调用callback(1) 并打破它
  • 如果你不在所有路径中调用回调,那么循环将永远不会“结束”。如果您的路径没有调用回调,那么您做错了。这是异步的,你的返回值什么都不做。

标签: javascript node.js loops callback


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    实际上并没有一个“循环”可以打破。您收藏中的所有物品都是并行使用的

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

    来自文档:

    请注意,由于此函数将迭代器应用于 并行不保证迭代器函数将 按顺序完成。

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

    【讨论】:

    • 你能告诉我怎么做吗?我不能在代码中显示的return false; 行的位置调用callback(1) 并打破它
    • @mithunsatheesh 简短回答:你必须这样做,是的,你可以。
    • 而不是 return false,只需执行“return callback({data:false})”并检查最终回调中的第一个参数。
    • 没有解决我的问题,但启发我尝试不同的方法。
    猜你喜欢
    • 2010-12-19
    • 2023-03-10
    • 1970-01-01
    • 2014-02-06
    • 2010-09-16
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多