node 的 javascript 环境是单线程的,还是所有事情都同时发生?或者(更有可能)这些陈述都没有解释节点发生了什么。
我是节点新手,并试图了解它如何处理回调。我在这个主题上的谷歌搜索没有被证明是富有成效的,而且似乎有多个受众使用诸如“线程、锁定和单线程”之类的术语,每个受众都有不同的上下文,而且我没有足够的节点经验来正确解析我在读什么。
根据我的阅读,node 的 javascript 执行环境就像浏览器一样,是单线程的。也就是说,尽管一切都是围绕异步回调设计的,但一切都以确定的顺序发生,并且永远不会有两个线程同时修改同一个变量或运行语句。我也读过这意味着节点程序员用户不必担心锁定语义。
如果我在浏览器领域并使用流行的 javascript 库之一来设置非 dom-event-handler 回调,例如
console.log("Here");
$.each([1,2,3],function(){
console.log("-- inside the callback --");
});
console.log("There");
我的输出始终如一
Here
-- inside the callback --
-- inside the callback --
-- inside the callback --
There
但是,如果我在节点 js 中使用回调执行类似操作(从命令行将其作为 shell 脚本运行)
var function example()
{
var fs = require('fs');
console.log("Here");
fs.readdir('/path/to/folder', function(err_read, files){
console.log('-- inside the callback --');
});
console.log("There");
for(var i=0;i<10000;i++)
{
console.log('.');
}
}
example();
console.log("Reached Top");
我一直(似乎 - 见上面的“没有太多经验”)得到这样的结果
Here
There
.
. (repeat 10,000 times)
Reached Top
-- inside the callback --
也就是说,节点example
在调用回调之前完成了函数的执行。
这是节点中的确定性行为吗?或者有时会在example
函数完成之前调用回调?还是将取决于使用回调的库中的实现?
我理解 node 背后的想法是编写基于事件的代码——但我试图了解 node 真正在做什么,以及哪些行为可以依赖,哪些行为不能。