簡體   English   中英

async.series和async.each不能按預期工作

[英]async.series and async.each not working as expected

我正在嘗試使用nodeJS構建一個Web抓取工具,該工具在網站的HTML中搜索圖像,緩存圖像源URL,然后搜索最大尺寸的URL。

我遇到的問題是,在循環通過圖像源URL的數組以獲取其文件大小之前,正在觸發deliverLargestImage() 我試圖同時使用async.seriesasync.each來使其正常工作。

如何強制deliverLargestImage()等到async.eachgetFileSizes()完成?

JS

var async, request, cheerio, gm;
async = require('async');
request = require('request');
cheerio = require('cheerio');
gm = require('gm').subClass({ imageMagick: true });

function imageScraper () {
  var imgSources, largestImage;
  imgSources = [];
  largestImage = {
    url: '',
    size: 0
  };

  async.series([
    function getImageUrls (callback) {
      request('http://www.example.com/', function (error, response, html) {
        if (!error && response.statusCode === 200) {
          var $ = cheerio.load(html);
          $('img').each(function (i, elem) {
            if ( $(this).attr('src').indexOf('http://') > -1 ) {
              var src = $(this).attr('src');
              imgSources.push(src);
            }
          });
        }
        callback();
      });
    },
    function getFileSizes (callback) {
      async.each(imgSources, function (img, _callback) {
        gm(img).filesize(function (err, value) {
          checkSize(img, value);
          _callback();
        });
      });
      callback();
    },
    function deliverLargestImage (callback) {
      callback();
      return largestImage;
    }
  ]);

  function checkSize (imgUrl, value) {
    var r, raw;
    if (value !== undefined) {
      r = /\d+/;
      raw = value.match(r)[0];
      if (raw >= largestImage.size) {
        largestImage.url = imgUrl;
        largestImage.size = raw;
      }
    }
  }
}

imageScraper();

嘗試在此處移動callback()

function getFileSizes (callback) {
  async.each(imgSources, function (img, _callback) {
    gm(img).filesize(function (err, value) {
      checkSize(img, value);
      _callback();
    });
  }, function(err){ callback(err); }); /* <-- put here */
  /* callback(); <-- wrong here */
},

each元素each接受一個回調作為第三個參數 ,當每個元素的內部循環完成時將執行該回調:

參數

  • arr要迭代的數組。
  • iterator(item, callback) -一個應用於arr每個項目的函數。 迭代器傳遞了一個callback(err) ,完成后必須調用該callback(err) 如果沒有發生錯誤,則應在不使用參數或使用顯式null參數的情況下運行callback
  • callback(err) -所有iterator函數完成或發生錯誤時調用的回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM