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,以将潜在阻塞的项目从调用堆栈中移出并移动到事件队列中,以便引擎可以继续处理调用堆栈(并且不冻结浏览器/服务器)并有效地“背景” – 运行或阻止操作。