2016-09-16 77 views
0

在異步瀑布中的第二個函數中,我的代碼中的eachSeries回調(urlCallback)在瀑布回調(waterfallCallback)後執行,原因我無法理解。在瀑布中嵌套的async.eachSeries按錯誤順序執行

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,所述async.eachSeries有三個參數(數組,functionToBeExecuteOnEachItem,回調)和以該順序執行它們。不知何故不在這裏。

回答

3

async.eachSeries的參數是函數定義。類似於waterfallCallbackfunction(err,result){}

當你調用waterfallCallback(null, itemUrls),這不是一個函數定義,它正在運行該函數本身!

更改爲只需waterfallCallback應該做的伎倆。

更新:此外,.eachSeries不返回值作爲數組,其最終回調只是function(err)。結賬.mapSerieslink取而代之,它將在最終回調function(err,finalArray)中返回結果數組。 (請注意,.map的每個返回將是數組中的一個元素,因此如果返回一個數組,您將獲得如下數據結構,如[ [], [], [] ]

+0

非常有幫助。但是,它看起來像'urlCallback(null,itemUrls)'不會根據需要返回數組。 – Erasmus

+0

'urlCallback'是否在'eachSeries'回調中返回指定的數組? – Erasmus

+0

啊,是的。我已經更新了我的答案。 – clay