Node.Js是否所有的同步调用保证在asynchronous调用之前执行?

我是NodeJS的新手,我正试图让我的头在各种情况下如何处理事件循环。

采取以下代码片段:

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

它给出了以下输出:

 Hello World Immediate 

只有在您愿意相信所有asynchronous呼叫都发生在所有同步呼叫之后才有意义。

真的吗 ? 所有节点同步调用都假设在asynchronous调用之前执行。

事件循环事件何时开始? parsing整个文件或节点运行时启动后? 或者当它遇到第一个asynchronous调用?

只有当我接受其中一个假设时,我才能合理化上述输出,要么所有的asynchronous调用都发生在同步调用之后, 事件循环在所有同步调用完成后启动,或者setImmediate()在这里比console.log()需要更多的时间来完成。

哪一个是正确的?

调用堆栈由同步调用( console.log )填充,事件队列使用asynchronous调用( 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 

:你可以在这里看到的是一个更准确的animationhttp://latentflip.com/loupe/?code=Y29uc29sZS5sb2coJ0hlbGxvJykKCnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICBjb25zb2xlLmxvZygnSW1tZWRpYXRlJykKfSwgMCkKCmNvbnNvbGUubG9nKCdXb3JsZCcp!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D

Javascript是单线程的,这意味着它只有一个调用堆栈。 浏览器(和节点)提供asynchronousAPI,以将潜在阻塞的项目从调用堆栈中移出并移动到事件队列中,以便引擎可以继续处理调用堆栈(并且不冻结浏览器/服务器)并有效地“背景” – 运行或阻止操作。