Javascript-如何通过JS引擎或浏览器/节点外部API来调度与setTimeout相比的promise回调?
作者:互联网
我在问题的两个不同部分考虑整个JS环境.
> JS引擎
>浏览器API,节点API(JS引擎外部).
JavaScript引擎(V8,SpiderMonkey)是单线程的,在ES6之前,没有机制可以在JavaScript中运行异步代码,直到ES6引入Promise概念.
我了解在诺言出现之前,浏览器或Node API(服务器端JS)用于提供使用setTimeout和Process.nextTick异步运行代码的机制,并且由于Promises在本机上受支持在Javascript中运行异步代码,因此,我试图了解如何promise回调和setTimeout被安排为先运行.
这是否意味着存在两个事件循环并且它们相互协调?首先在浏览器/节点API中运行setTimeout和Process.nextTick中的代码,然后在JS引擎中运行承诺回调,如果没有,则如何安排它们,因为JS引擎中不存在setTimeout和Process.nextTick定义,但是Promise定义Promise是ES6标准,因此必须存在于JS引擎中.
我也想了解任务队列,作业队列,微任务在哪里进行管理,内部JS引擎或外部引擎(在浏览器或Node API中)的位置.
解决方法:
两个主要的js运行时引擎:
>浏览器
> nodejs(V8)
在浏览器(谷歌浏览器)中:
MacroTask:
> setTimeout
> setInterval
MicroTask:
>承诺
执行顺序:
Promise> Promise.then> setTimeout
在nodejs运行时:
微任务:
> process.nextTick
>承诺
宏任务:
> setTimeout
> setInterval
> setImmediate
> I / O
执行顺序:
promise> process.nextTick> promise.then > setImmediate> setTimeout
关于事件循环的很多文章.给您一些参考,以帮助您了解该理论:
> How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding with async/await
> event-loop
> event-loop-timers-and-nexttick
标签:event-loop,node-js,promise,settimeout,javascript 来源: https://codeday.me/bug/20191109/2012324.html