2013-02-18 6 views
8

こんにちは私は、非ループ的にforループを実装するために、node.jsのasyncモジュールを使用しています。どのようにasync.js各ループを壊す?

私の質問は:どのようにループの実行を中断し、ループから抜け出すか?私はreturnreturn falseを送ろうとしましたが運はありませんでした。テストがtrueを返すまで

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); }  
); 
+3

を使用"エラー"とループを停止します)。あなたが最後のコールバックでそれが休憩であってエラーではないことを知るために確認できる既知の値(真実* 1)にします。 – Chad

+0

ここでこれを行う方法を教えていただけますか? 'return false;の場所で' callback(1) 'を呼び出すことはできません。コードに表示された行を破ります。 – mithunsatheesh

+0

すべてのパスでコールバックを呼び出さないと、ループは決して終了しません。コールバックを呼び出さないパスがある場合、それは間違っています。これは非同期で、戻り値は何もしません。 – Chad

答えて

5

async.until繰り返し関数を呼び出します。ここでは

は、サンプルコードです。したがって、ループを終了するには、テストが真でなければなりません。これは、テストが真と評価されている間に繰り返し実行されるasync.whilstの反対です。

async.eachは、関数を並行して呼び出すので、返される内容は問題になりません。あなたが壊すことのできるループではなく、配列をループするイテレータです。 async.eachの使用を中止する条件は、async.untilのテストである必要があります。ルールを繰り返し処理する必要があります。

5

本当に "ループ"が抜け落ちることはありません。あなたのコレクション内のすべてのアイテムが並行して使用されます

「ループ」を「中断する」唯一の方法は、エラー引数でコールバックを呼び出すことです。あなたがそこに他のものを置くのを止めるものはないので、少しハックすることができます。この関数は 並行して各項目にイテレータを適用するため、イテレータ関数が順番に完全 という保証がないこと

注:ドキュメントから

エラーが返っても、潜在的にいくつかの未解決のリクエストがありますので、実際に使用するアイテムの量を1回に制限したいと考えています。未処理要求の量を制限するには、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`として解釈される `(コールバック関数の最初のパラメータで何かを送信することにより、破ることができるunderscore

+0

ここでこれを行う方法を教えていただけますか? 'return false;の場所で' callback(1) 'を呼び出すことはできません。コード内に表示された行を破棄します。 – mithunsatheesh

+0

@mithunsatheesh短い答え:あなたはする必要があります。 – Chad

+1

の代わりにfalseを返すだけで、 "return callback({data:false})"を実行して、最終コールバックの最初の引数をチェックします。 – AndyD

関連する問題