0

在异步瀑布的第二个函数中,我代码中的eachSeries回调 ( urlCallback) 在瀑布回调 ( waterfallCallback) 之后执行,原因我无法确定。

   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,回调)并按顺序执行它们。不知何故不在这里。

4

1 回答 1

3

的参数async.eachSeries是函数定义。像waterfallCallback或之类的东西function(err,result){}

当您调用时waterfallCallback(null, itemUrls),那不是函数定义,而是运行函数本身!

改为简单地waterfallCallback应该可以解决问题。

更新:另外,.eachSeries不将值作为数组返回,它的最终回调只是function(err). 而是结帐.mapSeries 链接,它将在最终的回调中返回结果数组function(err,finalArray)。(请注意,a 的每次返回都.map将是数组中的一个元素,因此如果您返回一个数组,您将获得类似的数据结构[ [], [], [] ]

于 2016-09-16T15:33:34.593 回答