【发布时间】:2016-09-15 22:48:41
【问题描述】:
我对@987654321@ 线程有些困惑。
据我所知,nodejs 在单线程中运行。如果调用了异步函数,nodejs 将创建一个新线程来运行这些异步代码。异步代码完成后。 event loop 将获得异步结果并在另一个新线程中触发回调函数。
为了测试,我进行了如下代码测试:
var fs = require("fs");
fs.readFile('package.json','utf-8', function (err, data) {
if(err)
console.log(err)
else
console.log(data);
});
console.log("before loop");
while(true);
console.log("after loop");
我的预期结果是:
循环前
-- package.json 内容 --
其实得到:
循环前
我可能在某些地方错了。
问题:
- 为什么
while(true)屏蔽了readFile()或者屏蔽了它的回调函数? - 这些线程之间是什么关系?
【问题讨论】:
-
回调的神奇之处在于闭包。当您将一个函数传递给
readFile时,它会使该函数保持活动状态,并使闭包中捕获的所有变量保持活动状态。稍后,node 可以突然调用该函数(假设您已经返回到 node 的事件循环),从程序员的角度来看,这非常方便,因为闭包在调用之间携带变量。可以从您显示的代码示例返回,因为任何必要的变量都将保持活动状态,并且可以从需要它们的任何函数访问。
标签: node.js asynchronous