多个异步 http get 请求
Posted
技术标签:
【中文标题】多个异步 http get 请求【英文标题】:Multiple async http get requests 【发布时间】:2012-12-23 11:20:14 【问题描述】:我正在为 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请求完成后对它们的结果做点什么。 【参考方案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 请求的“结束”事件从未被触发。 我修复了一些已发布的范围,现在可以使用了!非常感谢。以上是关于多个异步 http get 请求的主要内容,如果未能解决你的问题,请参考以下文章
OkHttpOkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )