node.js - waterfall 中嵌套的 async.eachSeries 以错误的顺序执行

标签 node.js asynchronous request waterfall

在异步 waterfall 中的第二个函数中,我的代码中的 eachSeries 回调 (urlCallback) 在 waterfall 回调 (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 采用三个参数(数组、functionToBeExecuteOnEachItem、回调)并按该顺序执行它们。不知何故不在这里。

最佳答案

async.eachSeries 的参数是函数定义。类似于 waterfallCallbackfunction(err,result){}

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

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

更新:此外,.eachSeries 不会以数组形式返回值,其最终回调只是 function(err)。 checkout .mapSeries link相反,它将在最终回调函数(err,finalArray) 中返回结果数组。 (请注意,.map 的每次返回都将是数组中的一个元素,因此如果返回数组,您将获得类似 [ [], [], [] ] 的数据结构)

关于node.js - waterfall 中嵌套的 async.eachSeries 以错误的顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534571/

相关文章:

javascript - 字符串化 JSON 内部对象的最佳实践

swift - 如何通过 Swift 中的闭包设置惰性计算属性的值?

javascript - 使用 Spring Controller 的缓慢 GET 请求

php - 尝试每 10 秒打开一个页面

node.js - 将 LINEAR16 音频编码为 Twilio 媒体音频/x-mulaw | Node JS

node.js - 如何使用完整的url调试nodejs?

javascript - 如何在异步库的 "Each"函数中定义回调?

java - 在 Tomcat 中触发内部 ServletRequest

javascript - npm run build 后 React 组件的 onClick 未呈现

c# - MVC4 + async/await + 在 Action 完成前返回响应