gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:47:22 24 4
gpt4 key购买 nike

我正在尝试遵循有关异步原理的 NodeSchool 教程。有一个类(class)要求:

  • 向 3 个网址发出异步 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 的响应?

注意:该分配明确禁止使用第三方库,例如asyncafter

编辑:我尝试过的另一件事(显然也失败了),是像这样内联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;
}
}

编辑了我原来的答案。

关于javascript - Node.JS - 如何识别哪个异步 HTTP GET 响应在回调中返回数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28529636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com