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
方法是什么?另外,请随意提交您已经发布的答案。