Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么阻止Node.js异步_Node.js_Loops_Asynchronous_Synchronous_Event Loop - Fatal编程技术网

是什么阻止Node.js异步

是什么阻止Node.js异步,node.js,loops,asynchronous,synchronous,event-loop,Node.js,Loops,Asynchronous,Synchronous,Event Loop,当您使用Node.js时,您使用的是异步编程 为了处理层次结构,您显然使用回调。我还知道一些函数正在阻塞主事件循环,例如readFileSync() 但我注意到,即使像for循环这样简单的东西也会阻塞主事件循环 例如: function func1() { for(var i = 0; i < 1000000000; i++) { } console.log("func1") } function func2() { console.log('func2')

当您使用Node.js时,您使用的是异步编程

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

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

例如:

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

func1()
func2()
函数func1(){
对于(变量i=0;i<100000000;i++){
}
console.log(“func1”)
}
函数func2(){
console.log('func2')
}
func1()
func2()
在这种情况下,“func1”将始终在“func2”之前打印,并在循环完成时首先打印。这对我来说似乎不是异步的。我是说为什么我们要等到func1完成后再运行func2


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

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

这个循环只需要执行任务(在您的例子中是执行.js代码),然后这一个线程必须从头到尾执行。在这段时间内,不会执行任何其他操作。 (只需注意高级用户——如果您生成了worker,您可以,但这不是您通常使用Node.js的方式)

它有许多优点-无死锁、确定性行为等

因此,异步性意味着,如果启动一个异步任务(即对某个web的请求),它不会阻止要执行的事件循环。它要么被放入堆栈并在事件循环接收它时等待,要么如果它是某个更高级的模块,它在内部生成worker来处理内部的某些内容

但是,您编写的代码始终如下所示:

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

计算机计算for循环的速度可能会比gap快