{ console.-6ren">
gpt4 book ai didi

javascript - Node.Js 是否保证所有同步调用都在异步调用之前执行?

转载 作者:行者123 更新时间:2023-11-30 15:02:58 24 4
gpt4 key购买 nike

我是 NodeJS 的新手,我想了解事件循环在各种情况下的工作原理。

采用以下代码片段:

console.log("Hello");

setImmediate(() => {
console.log("Immediate");
});

console.log("World");

它给出了以下输出:

Hello
World
Immediate

只有您愿意相信所有异步调用都发生在所有同步调用之后才有意义。

这是真的吗?是否所有 Node 同步调用都应该在异步调用之前执行。

事件循环事件什么时候开始?解析整个文件后或 Node 运行时启动时?或者当它遇到第一个异步调用时?

只有当我接受其中一个假设时,我才能合理化上述输出,要么所有异步调用都发生在同步调用之后,即。事件循环在所有同步调用完成后开始,或者此处的 setImmediate()console.log()

花费更多时间完成

哪个是正确的?

最佳答案

调用堆栈由同步调用 (console.log) 填充,事件队列由异步调用 (setImmediate) 填充。在事件循环处理事件队列之前,必须完全清空调用堆栈。这实际上是您的程序在调用堆栈和事件队列中的样子:

状态 1:

stack                        queue
[console.log('Hello')] [setImmediate(() => ...)]
[console.log('World')]

状态 2:

stack                        queue 
[console.log('World')] [setImmediate(() => ...)]

状态 3:

stack                        queue 
[setImmediate(() => ...)]

状态 4(事件循环出列并推送到调用堆栈):

stack                        queue 
[console.log('Immediate')]

状态 5(完成):

stack                        queue 

您可以在这里看到更准确的动画:http://latentflip.com/loupe/?code=Y29uc29sZS5sb2coJ0hlbGxvJykKCnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICBjb25zb2xlLmxvZygnSW1tZWRpYXRlJykKfSwgMCkKCmNvbnNvbGUubG9nKCdXb3JsZCcp!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D

Javascript 是单线程的,这意味着它只有一个调用堆栈。浏-运行或阻塞操作。

关于javascript - Node.Js 是否保证所有同步调用都在异步调用之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46221740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com