Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何中断async.js每个循环?_Javascript_Node.js_Loops_Callback - Fatal编程技术网

Javascript 如何中断async.js每个循环?

Javascript 如何中断async.js每个循环?,javascript,node.js,loops,callback,Javascript,Node.js,Loops,Callback,嗨,我正在使用node.js模块异步实现for循环 我的问题是:如何中断循环执行并退出循环?我试着给出返回,返回错误,但没有运气 以下是示例代码: async.until( function() { return goal; }, function(callback) { async.each(_rules, function(rule,callback) { var outcome = tru

嗨,我正在使用node.js模块异步实现for循环

我的问题是:如何中断循环执行并退出循环?我试着给出
返回
返回错误
,但没有运气

以下是示例代码:

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.till
反复调用函数,直到测试返回true。所以测试必须返回true,以便退出循环。这与
async.while相反,后者在测试结果为true时重复运行

async。每个
并行调用函数,因此返回什么并不重要。它不是一个可以中断的循环,而是一个在数组上循环的迭代器。停止使用
async的条件。每个
都应该进行
async测试。直到
为止,您应该自己迭代规则。

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

“中断”循环的唯一方法是使用错误参数调用回调。因为没有什么可以阻止你把其他东西放进去,你可以稍微修改一下

从文档中:

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

即使您返回一个错误,您仍可能有几个未完成的请求,因此您确实希望限制一次性使用的项目数量。要限制未完成请求的数量,可以使用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:如果您没有执行异步,请使用

您可以通过在回调的第一个参数中发送某些内容来中断(该参数将被
async
解释为“错误”并停止循环)。让它成为一个已知值(真实值),您可以在最后的回调中检查它,以知道它是中断而不是错误。您能告诉我如何在这里执行此操作吗?我不能在
返回false的位置调用
回调(1)
我在代码中显示的行并中断它如果您没有在所有路径中调用回调,那么循环将永远不会“结束”。如果您有一个路径没有调用回调,那么您就做错了。这是异步的,您的返回值不起任何作用。您能告诉我如何在这里执行此操作吗?我不能在
返回false的位置调用
回调(1)
我在代码和中断中显示的行it@mithunsatheesh简短回答:你必须这样做,是的,你可以。不要返回false,只需执行“returncallback({data:false})”并检查最终回调中的第一个参数。没有解决我的问题,但启发我尝试另一种方法。