我正在发出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
在这种情况下,我希望print语句的顺序是
while
因为我希望响应的结束在Program has finished
Finished receiving data
循环终止之前发生。但是,无论该循环是1还是1还是1到100000000000,我总是得到
{{1}}
为什么打印报表按此顺序发生?
答案 0 :(得分:2)
对于其异步表达性的所有大惊小怪,node.js是单线程的,每个进程只有一个执行线程 - 这意味着一次只能执行一行代码。
当您对http.get
进行异步调用时,node.js发送HTTP GET并推迟执行回调,直到(1)回调准备好被调用,(2)它用完了同步(阻止)代码运行。这解释了为什么你总是首先看到"Program is finished"
- node.js已经完成了阻塞代码的执行,并准备继续处理包含"Finished receiving data"
的异步回调。