【问题标题】:Multiple async http get requests多个异步 http get 请求
【发布时间】:2023-03-06 05:35:01
【问题描述】:

我正在为 Node.js 中的异步事件而苦苦挣扎。

我的应用正在执行第一个 HTTP GET 请求,然后根据在响应正文中找到的一些信息,它循环了一定次数。

在每次迭代时,它都会调用一个函数,该函数发送其他 HTTP GET 请求并返回一个推入到元素数组中的结果。

我的问题是,当所有 http 请求都完成后,我想 console.log() 元素数组。这是我的代码:

http.get('mysite.com', function(res) {
    var body = '';
    res.on('data', function(chunk) {
        body += chunk;
    });
    res.on('end', function() {
        var last = 5,
            elements = [];
        for(var i=0; i < last; i++) {
            elements.push(myRequest(i));
        }
        console.log(elements);
        // Do some stuff with the elements array after it has been populated
    });
}).on('error', function(error) {
    console.log(error);
});

var myRequest = function(i) {
    http.get('mysite.com/page' + i, function(res) {
        var body = '';
        res.on('data', function(chunk) {
            body += chunk;
        });
        res.on('end', function() {
            // Do parsing here
            return parsed;
        });
    }).on('error', function(error) {
        console.log(error);
    });
};

我考虑过使用异步模块,但我不确定如何在这个用例中使用它。

提前致谢!

【问题讨论】:

  • 根据定义,http get 是异步的。没有真正看到你想做什么。
  • 我只想在所有http请求完成后对它们的结果做点什么。

标签: node.js asynchronous


【解决方案1】:

我会使用异步库,也可能会使用队列。但是如果你想手工做,没有测试过下面的任何东西,也不确定这是最干净的方法,但它可能会给你一些想法。

将回调传递给您的请求函数:

var myRequest = function(i, cb){
   ...
   res.on('end', function(){
      cb(parsed);
   });
}

及以上 onEnd-call 看起来更像这样:

var last = 5, elements = [];

var rep = function(i){
  if( i < last ){
     myRequest(i, function( result ){
        elements.push(result);              
        rep(i+1);
     });
  } else {
    console.log(elements);
    // Do some stuff with the elements array after it has been populated
  }
}

res.on('end', function() {
   rep(0);
});

使用异步会更好看。不过现在得跑了……

【讨论】:

  • 哼它似乎不起作用。该应用程序只是挂起并且什么也不做/不打印任何东西。
  • 据我所知,第一个 http.get 请求的“结束”事件从未被触发。
  • 我修复了一些已发布的范围,现在可以使用了!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-04-10
  • 2011-01-08
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多