9

こんにちは、for ループを非同期的に実装するために node.js のasyncモジュールを使用しています。

私の質問は、ループの実行を中断してループから抜け出す方法は? を与えてみましたが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これは、テストが true であると評価される間、繰り返し実行されるのとは反対です。

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 に答える