Node.JS-如何识别哪个异步HTTPGET响应在回调中返回数据
Node.JS - How to identify which async HTTP GET response is returning data in a callback?
我正在努力学习NodeSchool关于异步原理的教程。有一个教训,要求:
- 对3个URL发出异步GET请求
- 使用回调收集HTTP响应中返回的数据
- 打印从每个响应中收集的数据,保留相关输入URL的顺序
我想到的一种方法是制作3个单独的回调,每个回调都写入自己的专用缓冲区。但对我来说,这似乎是一个糟糕的解决方案,因为它需要代码复制,而且不可扩展。然而,我一直在想另一种方法来回调,以记住"它来自哪里",因为没有更好的术语。或者它是按照什么顺序调用的,等等
我觉得我已经接近了,但我已经被困在"接近"的地方足够长的时间来寻求帮助。到目前为止,我感觉最接近的是:
var http = require('http');
var replies = 0;
var results = ['','',''];
var running = '';
for(var i = 2; i < 5; i++) {
http.get(process.argv[i], function (response) {
response.setEncoding('utf8');
response.on('data', handleGet);
response.on('error', handleError);
response.on('end', handleEnd);
});
}
function handleGet(data) {
running += data;
}
function handleError(error) {
console.log(error);
}
function handleEnd() {
results[replies] = running;
running = '';
replies++;
if(replies === 3) {
for(var i = 0; i < 3; i++) {
console.log(totals[i]);
}
}
}
如何让回调识别其响应是对哪个get的响应?
注意:分配特别禁止使用第三方库,如异步或之后的。
编辑:我尝试过的另一件事(显然也失败了)是内联handleGet的回调定义,以尝试保留回调的"索引":
response.on('data', function(data) {
results[i-2] += data;
});
在执行时,这总是索引到结果[3],因为异步回调直到for循环完成很久之后才会发生。(事实上,我根本不确定为什么I的值会保持在5,因为据我所知,完成的for循环会超出范围……回想起来,我会认为它是未定义的。)
我建议使用第二个解决方案,但传递i
的值并创建另一个包含该变量的函数。我的意思是:
(function(){
var index = i;
http.get(process.argv[i], function (response) {
response.setEncoding('utf8');
response.on('data', handleGetFrom(index));
response.on('error', handleError);
response.on('end', handleEnd);
})
}());
和handleGetFrom
:
var handleGetFrom = function(i) {
return function(data) {
results[i-2] += data;
}
}
编辑了我的原始答案。
您可以使用"this"对象:
var http = require('http');
http.get('http://www.google.com', function (response) {
response.setEncoding('utf8');
response.on('data', function(chunk) {
console.log(this); // Holds the respons object
console.log(this.headers.location); // Holds the request url
});
});
相关文章:
- 如何将getJson的响应保存在全局变量中
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 使用angularjs向浏览器发送servlet响应(下载功能)
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 不再使用innerHTML进行AJAX响应.(代码未得到响应)
- 为什么可以't我使用了AJAX响应的一部分
- 响应动画手风琴不工作
- 如何从SeleniumWebdriver获取异步Javascript响应
- Ajax调用在Firefox中不会自动响应
- 可以在响应时隐藏iphone上的“播放”按钮以进行视频播放
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- 如何在 JavaScript 和 HTML 中更改对输入框的提示响应
- IIS动态HTTP响应标头
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- Ajax响应转换
- 使Intro.js工具提示响应
- 存储$http如何从$http函数(Angularjs)外部获取可访问变量中的响应
- 将高图饼图中的文本居中显示为响应
- Node.JS-如何识别哪个异步HTTPGET响应在回调中返回数据