2014-09-07 27 views
5

Async modülü ile yarım gün boyunca mücadele ediyor, ancak birkaç seviye yerleştirirken düzgün çalışmaz. Kod nedeniyle uzun bir gönderi biraz, ama lütfen benimle çıplak lütfen, tüm kod tamam çalıştırmalı.Yuvalama düğümü async.eachSeries

 

    var async = require('async') 

    var myarr = ["Outer - A", "Outer - B"]; 
    var myarr2 = ["Inner - A", "Inner - B"]; 
    var innerComplete = true; 

    async.eachSeries(myarr, function(item, outerCallback) { 
     console.log('Processing item ' + item); 
     async.series([ 
      function(callback) { 
       takeTime(2000, item, callback) 
      }, 
      function(callback) { 
       takeTime(1000, item, callback) 
      }, 
      function(callback) { 


       outerCallback(); 
      } 
     ], function(err) { 
      console.log("---OUTER SEQUENCE---") 

     }) 
    }, function(err){ 
     console.log("---OUTER LOOP---") 

    }); 

    function takeTime(ms, msg, callback) { 
     console.log("Starting " + ms + " ms task from " + msg); 
     setTimeout(function() { 
      console.log("Finished " + ms + " ms task from " + msg); 
      callback(); 
     }, ms); 
    } 

Ve böyle sırayla güzel şeyi verir:

Yani bu Tamam çalışır

 
Processing item Outer - A 
Starting 2000 ms task from Outer - A 
Finished 2000 ms task from Outer - A 
Starting 1000 ms task from Outer - A 
Finished 1000 ms task from Outer - A 
Processing item Outer - B 
Starting 2000 ms task from Outer - B 
Finished 2000 ms task from Outer - B 
Starting 1000 ms task from Outer - B 
Finished 1000 ms task from Outer - B 
---OUTER LOOP--- 

Ama hiç böyle içine yuva için başka eachSeries döngü çalıştığınızda:

 

    var async = require('async') 

    var myarr = ["Outer - A", "Outer - B"]; 
    var myarr2 = ["Inner - A", "Inner - B"]; 
    var innerComplete = true; 

    async.eachSeries(myarr, function(item, outerCallback) { 
     console.log('Processing item ' + item); 
     async.series([ 
      function(callback) { 
       takeTime(2000, item, callback) 
      }, 
      function(callback) { 
       takeTime(1000, item, callback) 
      }, 
      function(callback) { 
       async.eachSeries(myarr2, function(item2, outerCallback2) { 
        console.log('Processing item ' + item2); 
        async.series([ 
         function(callback2) { 
          takeTime(2000, item2, callback2) 
         }, 
         function(callback2) { 
          takeTime(1000, item2, callback2) 
         } 
        ], function(err) { 
         console.log('---INNER SEQUENCE---') 

        }) 
       }, function(err){ 
        console.log("---INNER LOOP---") 
       }); 

       outerCallback(); 
      } 
     ], function(err) { 
      console.log("---OUTER SEQUENCE---") 

     }) 
    }, function(err){ 
     console.log("---OUTER LOOP---") 

    }); 

    function takeTime(ms, msg, callback) { 
     console.log("Starting " + ms + " ms task from " + msg); 
     setTimeout(function() { 
      console.log("Finished " + ms + " ms task from " + msg); 
      callback(); 
     }, ms); 
    } 

Aşağıdaki gibi ikinci eachSeries döngüsünü girerken yürütme sırasını kaybeder:

 
Processing item Outer - A 
Starting 2000 ms task from Outer - A 
Finished 2000 ms task from Outer - A 
Starting 1000 ms task from Outer - A 
Finished 1000 ms task from Outer - A 
Processing item Inner - A 
Starting 2000 ms task from Inner - A 
Processing item Outer - B 
Starting 2000 ms task from Outer - B 
Finished 2000 ms task from Inner - A 
Starting 1000 ms task from Inner - A 
Finished 2000 ms task from Outer - B 
Starting 1000 ms task from Outer - B 
Finished 1000 ms task from Inner - A 
---INNER SEQUENCE--- 
Finished 1000 ms task from Outer - B 
Processing item Inner - A 
Starting 2000 ms task from Inner - A 
---OUTER LOOP--- 
Finished 2000 ms task from Inner - A 
Starting 1000 ms task from Inner - A 
Finished 1000 ms task from Inner - A 
---INNER SEQUENCE--- 

Ayrıca mapSeries vb, ama aynı olan, şelale çalıştı ya da yürütme dizisini haberci. Yanlış bir şey mi yapıyorum yoksa async modülü bu tür yuvalamayı desteklemiyor mu?

cevap

10

outerCallback2'u aramıyorsunuz, callback'u aramıyorsunuz ve hemen outerCallback numaralı telefonu arıyorsunuz.

async.eachSeries(myarr, function(item, outerCallback) { 
    ,----------------------------------------' 
    | console.log('Processing item ' + item); 
    | async.series([ 
    |  function(callback) { 
    |     `--------------, 
    |   takeTime(2000, item, callback) 
    |  }, 
    |  function(callback) { 
    |     `--------------, 
    |   takeTime(1000, item, callback) 
    |  }, 
    |  function(callback) { 
    |  ,-----------' 
    |  |  async.eachSeries(myarr2, function(item2, outerCallback2) { 
    |  | ,---------------------------------------------' 
    |  | | console.log('Processing item ' + item2); 
    |  | | async.series([ 
    |  | |  function(callback2) { 
    |  | |   takeTime(2000, item2, callback2) 
    |  | |  }, 
    |  | |  function(callback2) { 
    |  | |   takeTime(1000, item2, callback2) 
    |  | |  } 
    |  | | ], function(err) { 
    |  | |  console.log('---INNER SEQUENCE---') 
    |  | `---> outerCallback2(err); // <<< 
    |  |  }) 
    |  | }, function(err){ 
    |  |  console.log("---INNER LOOP---"); 
    |  `---> callback(err); // <<< 
    |   }); 
    |  } 
    | ], function(err) { 
    |  console.log("---OUTER SEQUENCE---") 
    `---> outerCallback(err); // <<< 
    }) 
}, function(err){ 
    console.log("---OUTER LOOP---") 
    console.log("everything done"); 
}); 
+0

Çalışılan harikalar ve uygun bir parça daha iyi böyle bir iç içe bir yapıda geri aramalar kavramak:

düzeltildi. Milyon teşekkürler Bergi! –

+0

Tanrım, yardımcı oldu, bunun için daha 'işlev çağrısı tabanlı' bir yolu var mı? – timhc22

+0

@ timhc22: "İşlev çağrısı tabanlı" ile ne demek istiyorsun? Geri aramaları geri döndürmekten hoşlanmıyorsanız ve geri dönüş değerleriyle ilgilenmekten hoşlanmıyorsanız, sözlerine bir göz atmalısınız. – Bergi