nodejs在提交多个请求时请求内存泄漏错误

时间:2014-05-14 23:37:32

标签: javascript node.js

让我来描述一下我在这里解决的问题。我需要迭代一个数组并为数组中的每个项启动一个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()   增加限额。

1 个答案:

答案 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 这非常适合异步调用 感谢