async.series和async.each未按预期工作
async.series and async.each not working as expected
我正试图使用nodeJS构建一个网络抓取器,该抓取器在网站的HTML中搜索图像,缓存图像源URL,然后搜索大小最大的URL。
我遇到的问题是deliverLargestImage()
在图像源URL的数组循环通过以获取其文件大小之前被激发。我正在尝试同时使用async.series
和async.each
来正常工作。
如何强制deliverLargestImage()
等待getFileSizes()
中的async.each
完成?
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
接受回调作为第三个参数,当每个元素的内部循环完成时执行:
参数
arr
-要迭代的数组iterator(item, callback)
-应用于arr
中每个项目的函数。迭代器被传递一个callback(err)
,一旦它已完成。如果没有发生错误,则callback
应在自变量或具有显式null
自变量callback(err)
-当所有iterator
函数时调用的回调已完成,或者发生错误
相关文章:
- jQuery加载的async和ready函数不工作
- 为什么当async标志设置为false时,xmlhttprequest中的代码可以工作,而当它设置为true时却不能工作
- async.parallel中的回调是如何工作的(它来自哪里?)
- Async.js队列工作程序未完成
- 节点's模块async没有'没有按预期工作
- 等待函数结束(在 async.series 中)无法按预期工作
- ajax json同步无法与设置为false的async一起工作
- 如何使for循环与async.parallel()一起工作
- Node.js - Async.js:并行执行是如何工作的
- Dojo: async调用setTimeout + Deferred——>不工作
- 设置bcrypt与Passport和async-await Node.js库一起工作
- Async / await不能与fetch一起工作
- Angularjs的focus意外地需要async setTimeout来工作
- Fine uploader Async任务在Chrome中工作,但在IE11中不工作
- ES2017 Async/await函数-它们只与promise一起工作吗
- jquery-ajax-async无法正常工作
- Async是如何真正工作的,以及如何在node.js(node-webkit)中正确使用它
- async.series和async.each未按预期工作
- async.waterfall 无法按预期工作
- 美元.ajax async:false不能在IE和Firefox中工作,在Chrome/Safari中工作