2016-09-16 101 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