Node.JS-如何识别哪个异步HTTPGET响应在回调中返回数据

Node.JS - How to identify which async HTTP GET response is returning data in a callback?

本文关键字:响应 HTTPGET 异步 回调 数据 返回 何识别 JS- 识别 Node      更新时间:2023-11-21

我正在努力学习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
    });
});