Javascript 而(计数!==3)无法检查回调状态
我是通过一个名为learnyonode的教程学习Node的。这是它提供的13个问题之一:向前3个命令行参数指示的3个URL发送3个http get请求,在收集所有响应块时按URL的顺序打印响应。Javascript 而(计数!==3)无法检查回调状态,javascript,node.js,callback,Javascript,Node.js,Callback,我是通过一个名为learnyonode的教程学习Node的。这是它提供的13个问题之一:向前3个命令行参数指示的3个URL发送3个http get请求,在收集所有响应块时按URL的顺序打印响应。 我想出了以下代码片段: var http = require("http"); var count = 0; var strArr = ["","",""]; getData(0); getData(1); getData(2); while(count!==3); console.log(strArr
我想出了以下代码片段:
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循环为我保留print语句,直到count变为3,也就是说,所有3个响应都被完全收集。然而,它并没有像我预期的那样起作用。另外,我在while循环中放入了一个print语句,它显示count始终为0。然后我瞥了一眼答案,了解到一种方法是检查
响应的回调中的count值。在(“end”,…)
,如下所示:
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循环方法不起作用仍然让我困惑。提前感谢所有看过这篇文章的人。JavaScript是单线程的。它执行每个执行上下文,直到完成为止,然后使用事件循环检查是否有任何新的执行上下文排队等待它执行(例如异步函数的回调) 三个
getData
立即调用all return,然后while循环在线程中执行。直到当前执行上下文完成(直到while循环及其执行后的所有内容),才能执行对http.get的回调,因此计数无法增加,循环也无法结束
您找到的解决方案运行良好,但为了帮助理解,您应该认识到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毫秒任意检查一次,而不是等待第三次回调执行,然后立即记录结果。它只是演示了如何在不阻塞线程的情况下“循环”