是什么阻止 Node.js 异步

What stops Node.js from being asynchronous

当您使用 Node.js 时,您正在使用异步编程。

为了处理层次结构,您显然使用了回调。我也知道一些函数正在阻塞主事件循环,例如 readFileSync() ..

但我注意到即使像 for 循环这样简单的东西也会阻塞主事件循环。

示例:

function func1() {
    for(var i = 0; i < 1000000000; i++) {
    }
    console.log("func1")
}
function func2() {
    console.log('func2')
}

func1()
func2()

在这种情况下,'func1' 总是在 'func2' 之前打印,并且在循环完成时首先打印。这对我来说似乎不是异步的。我的意思是为什么我们要等待 func1 在 运行 func2 之前完成?

是否有任何阻止主事件循环的操作的列表,或者有人可以解释为什么会这样吗?

Node.js 有所谓的事件循环,它只由一个线程执行。

这个循环只执行任务(在你的情况下执行你的 .js 代码)然后这个单线程必须从头到尾。在此期间不会执行任何其他。 (请注意高级用户 - 如果你生成工人,你可以,但这不是你通常使用的方式Node.js)

它有很多优点 - 没有死锁、确定性行为等

所以异步性意味着如果你开始异步任务(即请求某些网络),它不会阻止你的事件循环被执行。它要么被放入堆栈并在事件循环获取它时等待,要么如果它是一些更高级的模块,它会在内部产生 worker 来处理内部的东西。

但是你写的代码总是这样的:

  • 从事件循环堆栈中获取任务
  • 从头到尾执行所有同步上下文
  • 将所有异步任务入栈
  • 重复该过程