2016-09-16 4 views
0

In der zweiten Funktion im asynchronen Wasserfall, der eachSeries Rückruf (urlCallback) in meinem Code nach dem Wasserfall Callback (waterfallCallback) ausgeführt, aus Gründen, die ich nicht out out kann.Verschachtelte async.eachSeries in Wasserfall wird in falscher Reihenfolge ausgeführt

async.waterfall([ 
     function(callback) { 
     request(website, function (error, response, html) { 
      if (!error && response.statusCode == 200) { 
       pageUrls = getPageUrls(html) 
       callback(null, pageUrls) 
      } 
      }) 
     }, 
     function (pageUrls, waterfallCallback) { 
      async.eachSeries(pageUrls, function (url, urlCallback) { 
       console.log('SET ' + url) 
       request(url, function (err, response, body) { 
        var $ = cheerio.load(body) 
        $('#div').children().each(function(){ 
        console.log($(this).children("a").attr("href")); 
        itemUrl = $(this).children("a").attr("href") 
        itemUrls.push(itemUrl) 
        }) 
        urlCallback(null,itemUrls) 
       }) 
      }, 
      waterfallCallback(null, itemUrls)) 
     } 
    ], 
     function(err, results) { 
     console.log("results: " + results) 
    }) 

AFAIK nimmt die async.eachSeries drei Argumente (array, functionToBeExecuteOnEachItem, Callback) und führen sie in dieser Reihenfolge. Irgendwie nicht hier.

Antwort

3

Die Parameter für async.eachSeries sind Funktionsdefinitionen. Etwas wie waterfallCallback oder function(err,result){}.

Wenn Sie waterfallCallback(null, itemUrls) aufrufen, ist das keine Funktionsdefinition, die die Funktion selbst ausführt!

Wechseln zu einfach waterfallCallback sollte den Trick tun.

Update: Auch .eachSeries gibt die Werte nicht als ein Array zurück, sein letzter Rückruf ist nur function(err). Auschecken .mapSerieslink stattdessen, die das resultierende Array im endgültigen Rückruf function(err,finalArray) zurückgeben wird. (Beachten Sie, dass jede Rückgabe eines .map ein Element im Array ist. Wenn Sie also ein Array zurückgeben, erhalten Sie Datenstrukturen wie [ [], [], [] ])

+0

Sehr hilfreich. Es sieht jedoch so aus, als würde 'urlCallback (null, itemUrls) 'das Array nicht wie gewünscht zurückgeben. – Erasmus

+0

Gibt 'urlCallback' das angegebene Array nicht im' eachSeries' Callback zurück? – Erasmus

+0

Ah, ja. Ich habe meine Antwort aktualisiert. – clay

Verwandte Themen