gpt4 book ai didi

javascript - while(count!==3) 无法检查回调状态

转载 作者:行者123 更新时间:2023-12-02 16:01:00 25 4
gpt4 key购买 nike

我正在通过 NodeSchool 的名为 learnyounode 的教程来学习 Node。 。这是关于它提供的 13 个问题之一:向前 3 个命令行参数指示的 3 个 url 发送 3 个 http get 请求,收集所有响应 block 后按 url 的顺序打印响应。
我想出了这个代码片段:

var http = require("http");
var count = 0;
var strArr = ["","",""];
getData(0);
getData(1);
getData(2);
while(count!==3);
console.log(strArr[0]);
console.log(strArr[1]);
console.log(strArr[2]);

function getData(i) {
http.get(process.argv[i+2], function (response) {
response.setEncoding("utf8");
response.on("data", function (data) {
strArr[i] += data;
});
response.on("end", function (data) {
count++;
});
});
}

我期望 while 循环为我保留打印语句,直到计数变为 3,即完全收集所有 3 个响应。但是,它没有按我的预期工作。另外,我在 while 循环中放置了一条 print 语句,它显示 count 始终为 0。
然后我查看了答案,了解到一种解决方法是检查 response.on("end", ...) 回调中的 count 值,如下所示:

var http = require("http");
var count = 0;
var strArr = ["","",""];
getData(0);
getData(1);
getData(2);

function getData(i) {
http.get(process.argv[i+2], function (response) {
response.setEncoding("utf8");
response.on("data", function (data) {
strArr[i] += data;
});
response.on("end", function (data) {
count++;
if(count===3) {
console.log(strArr[0]);
console.log(strArr[1]);
console.log(strArr[2]);
}
});
});
}

这样,我确实通过了测试,但是为什么 while-loop 方法不起作用仍然让我困惑。
预先感谢所有看到此内容的人。

最佳答案

JavaScript 是单线程的。它执行每个执行上下文直到完成,然后检查事件循环以查看是否有任何新的执行上下文排队等待执行(例如异步函数的回调)。

三个getData调用都立即返回,然后while循环在线程中执行。对 http.get 的回调在当前执行上下文完成之前无法执行(直到 while 循环及其后的所有内容都已执行),因此 count 无法增加,也无法让循环至结束。

您找到的解决方案效果很好,但为了帮助理解,您应该意识到 setTimeout 和 setInterval 是异步的,因此它们不会阻塞线程。您可以通过以下方法解决此问题:

getData(0);
getData(1);
getData(2);

setTimeout( function check_count ( ) {
if ( count !== 3 )
return setTimeout( check_count, 100 );

console.log(strArr[0]);
console.log(strArr[1]);
console.log(strArr[2]);

}, 100 );

这不是一个好的解决方案,因为它每 100 毫秒任意检查一次,而不是仅仅等到第三个回调执行然后立即记录结果。它只是演示如何“循环”而不阻塞线程。

关于javascript - while(count!==3) 无法检查回调状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31210242/

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