0

非同期ウォーターフォールの 2 番目の関数では、コード内のeachSeriesコールバック ( ) がウォーターフォール コールバック ( ) の後に実行されますが、その理由はわかりません。urlCallbackwaterfallCallback

   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 は 3 つの引数 (array,functionToBeExecuteOnEachItem,callback) を受け取り、その順序で実行します。どういうわけかここではありません。

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 に答える