Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 而(计数!==3)无法检查回调状态_Javascript_Node.js_Callback - Fatal编程技术网

Javascript 而(计数!==3)无法检查回调状态

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

我是通过一个名为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[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毫秒任意检查一次,而不是等待第三次回调执行,然后立即记录结果。它只是演示了如何在不阻塞线程的情况下“循环”