让我来描述一下我在这里解决的问题。我需要迭代一个数组并为数组中的每个项启动一个http GET请求。正如您在下面看到的,我正在迭代list
,在每次迭代时构建url并触发请求。
现在我明白请求正在使这些调用异步,但必须有一种方法来减慢循环。我尝试了setTimeout,但这似乎并没有影响它。我在阵列中有大约350个项目,需要350多个请求。我手工做这些,但需要自动化。
_.each(list, function (item) {
var url = 'https://google.com/search?tbm=nws&q='+query+" "+item;
request(url, function (err, resp, body) {
if (err) throw err;
var
dom = cheerio.load(body),
headlines = [];
dom('.r').each(function () {
var headline = dom(this).text();
if (headlines.join(' ').length < 450) {
headlines.push(headline);
}
});
q.resolve(headlines.join(' '));
});
});
错误
(节点)警告:检测到可能的EventEmitter内存泄漏。 11名听众补充道。使用emitter.setMaxListeners() 增加限额。
答案 0 :(得分:1)
尝试异步模块https://github.com/caolan/async:
您可以使用的代码是:
var async = require("async");
var request = require("request");
var cheerio = require("cheerio");
async.forEachLimit(list,1,function(item,callback){
var url = 'https://google.com/search?tbm=nws&q='+query+" "+item;
request(url, function (err, resp, body) {
if (err) throw err;
var
dom = cheerio.load(body),
headlines = [];
dom('.r').each(function () {
var headline = dom(this).text();
if (headlines.join(' ').length < 450) {
headlines.push(headline);
}
});
q.resolve(headlines.join(' '));
callback();
});
},function(err){
if(err)console.log(err);return;
});
不需要setTimeout 这非常适合异步调用 感谢