[英]async.series and async.each not working as expected
我正在嘗試使用nodeJS構建一個Web抓取工具,該工具在網站的HTML中搜索圖像,緩存圖像源URL,然后搜索最大尺寸的URL。
我遇到的問題是,在循環通過圖像源URL的數組以獲取其文件大小之前,正在觸發deliverLargestImage()
。 我試圖同時使用async.series
和async.each
來使其正常工作。
如何強制deliverLargestImage()
等到async.each
內getFileSizes()
完成?
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.