Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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 console.log为learnyonode.js教程以错误的顺序打印语句_Javascript_Node.js_Http - Fatal编程技术网

Javascript console.log为learnyonode.js教程以错误的顺序打印语句

Javascript console.log为learnyonode.js教程以错误的顺序打印语句,javascript,node.js,http,Javascript,Node.js,Http,我正在发出一个GET请求,存储数据,然后注意到响应已经结束。我有一个console.log语句用于我接收完数据的时间,另一个用于程序完成的时间。见下文: var a = 1 var b = 10e9 http.get(process.argv[2], function(response){ response.pipe(bl()) response.on('end', function(){ console.log("Finished receiving data") })

我正在发出一个
GET
请求,存储数据,然后注意到响应已经结束。我有一个
console.log
语句用于我接收完数据的时间,另一个用于程序完成的时间。见下文:

var a = 1
var b = 10e9

http.get(process.argv[2], function(response){
  response.pipe(bl())
  response.on('end', function(){
    console.log("Finished receiving data")
  })
})

while(a != b){
  a++
}

console.log("Program has finished")
在本例中,我希望打印语句的顺序是

Finished receiving data
Program has finished
因为我希望响应的结束发生在
循环终止之前,而
循环终止。然而,不管循环是1到2还是1到10000000000,我总是得到

Program has finished
Finished receiving data

为什么打印语句是按这种顺序出现的?

尽管对其异步表达能力有很多争议,node.js是单线程的,每个进程只有一个执行线程,这意味着一次只执行一行代码


当您对
http.get
进行异步调用时,node.js会发送一个http get,并推迟回调的执行,直到(1)回调准备好被调用,以及(2)要运行的同步(阻塞)代码用完。这解释了为什么您总是首先看到
“程序已完成”
node.js已完成其阻塞代码的执行,并准备继续处理包含
“已完成接收数据”的异步回调

这是一个异步调用-其余的代码在调用需要时间处理时运行。我知道
http.get()
调用是异步的,但之后就是一个巨大的循环。异步调用应该在该循环完成之前完成。这样的循环将“阻止”JS执行的所有其他操作。即使在底层,HTTP reuqest本身可能在循环完成之前就完成了–脚本中处理该请求的所有其他内容都将(被迫)等到循环完成。@CBroe,这很有意义,谢谢。尽管如此,我还是希望进行多个异步调用,并在执行另一组代码之前等待它们全部完成。如果这不起作用,那么正确的
node.js
方法是什么?另外,请随意提交您已经发布的答案。