2017-11-16 6 views
0

私はこの方法で長すぎます。おそらく、ここの誰かが私を少し助けてくれるでしょうか?Nodejsはそれぞれ内側の滝の内側に非同期に配置されています

私はオブジェクトの配列を含むオブジェクトを持っています、そして、私は先に進む前に順番に各オブジェクトのためのいくつかの操作を行う必要があります。

私は期待してい何
var demo = { 
     one: ['1'], 
     two: ['2'], 
     three: ['3', '4', '5'] 
    }; 

    async.waterfall([ 
     function(callback) { 
      console.log("Step 1"); 
      setTimeout(function() { 
        console.log("Doing stuff..."); 
        callback(null, demo); 
      }, 1000); 
     }, 
     function(prevData, callback) { 
      console.log("Step 2"); 
      async.each(prevData, function(obj) { 
       async.each(obj, function(item, callback2) { 
        setTimeout(function() { 
          console.log("Doing stuff for item: "+item); 
          callback2(null, demo); 
        }, 1000); 
       }); 
      }); 
      callback(null, demo); 
     } 
    ], function(err) { 
     if(err) { 
      alertify.error("Unhandled exception: "+err); 
     } else { 
      console.log("All stuff done."); 
     } 
    }); 

は、次のとおりです:ここでは、多くの一つは、私がしようとしてきた、単純化した例です

Step 1 
Doing stuff... 
Step 2 
Doing stuff for item: 1 
Doing stuff for item: 2 
Doing stuff for item: 3 
Doing stuff for item: 4 
Doing stuff for item: 5 
All stuff done. 

しかし、私は何を得る:

Step 1 
Doing stuff... 
Step 2 
All stuff done. 
Doing stuff for item: 1 
Doing stuff for item: 2 
Doing stuff for item: 3 
Doing stuff for item: 4 
Doing stuff for item: 5 

しようとしてきた場合は、おそらく、正しいレベルを除いて、私が考えることができる各レベルからのコールバックのすべての組み合わせです。明白である必要がありますが、私はちょうどそれを取得しません...

シーケンス自体は正しいですが、項目を操作する必要がある機能は、後で実行されません。

+0

おっと、ありがとうございます。テスト用のコードで出力を修正しましたが、ここに貼り付けたコードスニペットを更新するのを忘れました。今更新されました。 –

+0

関数をインライン化するのではなく、関数を抽出すると、コードが読みやすくなります。読みにくいです。 [要点](https://gist.github.com/sellomkantjwa/a8c3dd058c26646ea666312b61f82908)ここで、機能の一部はインラインではありません: –

+0

本当です。最終的なコードはextactされた関数であり、これは問題を見つけてそれを実証することです:) –

答えて

0

問題は、この部分である:

function(prevData, callback) { 
     console.log("Step 2"); 
     async.each(prevData, function(obj) { 
      async.each(obj, function(item, callback2) { 
       setTimeout(function() { 
         console.log("Doing stuff for item: "+item); 
         callback2(null, demo); 
       }, 1000); 
      }); 
     }); 
     callback(null, demo); 
    } 

すぐasync.eachした後、あなたがcallback(null, demo);を呼び出します。これはasync.eachが完了する前です。 async.eachが完了したら、callbackに電話する必要があります。これを行うには、async.eachに3番目のパラメータとして別のコールバックを追加します:

function (prevData, callback) { 
    console.log("Step 2"); 
    async.each(prevData, function (obj) { 
     async.each(obj, function (item, callback2) { 
      setTimeout(function() { 
       console.log("Doing stuff for item: " + item); 
       callback2(null, demo); 
      }, 1000); 
     }); 
    }, function asyncEachDone(err) { 
     callback(err, prevData) 
    }) 
} 
+0

それを解決しました。内側のasync.eachが完了した後にもう一度コールバックを追加する必要がありましたが、それはそれでした。ありがとう! –

関連する問題