嵌套的异步.瀑布中的每个系列的执行顺序是错误的



在异步瀑布中的第二个函数中,我的代码中的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)
    })

async。eachSeries接受三个参数(array,functionToBeExecuteOnEachItem,callback),并按顺序执行它们。

async.eachSeries的参数为函数定义。例如waterfallCallbackfunction(err,result){}

当你调用waterfallCallback(null, itemUrls)时,那不是一个函数定义,那是在运行函数本身!

改成简单的waterfallCallback就可以了。

更新:同样,.eachSeries不返回值作为一个数组,它的最终回调只是function(err)。签出.mapSeries链接,它将在最后的回调function(err,finalArray)中返回结果数组。(注意,每次返回的.map都是数组中的一个元素,所以如果返回一个数组,就会得到类似[ [], [], [] ]的数据结构)

相关内容

  • 没有找到相关文章

最新更新