我在问题的两个不同部分考虑整个 JS 环境。
- JS引擎
- 浏览器 API、 Node API(JS 引擎外部)。
JavaScript 引擎(V8、SpiderMonkey)是单线程的,在 ES6 之前,没有机制在 JavaScript 中运行异步代码,直到 ES6 引入 Promise 概念。
我知道在 promises 出现之前,浏览器或 Node API(服务器端 JS)曾经提供使用 setTimeout 和 Process.nextTick
异步运行代码的机制,并且由于原生支持 Promises 运行异步Javascript 中的代码,我试图了解如何安排 promise 回调和 setTimeout 一个接一个地运行。
这是否意味着存在两个事件循环并且它们相互协调?首先在浏览器/Node API 中运行来自 setTimeout 和 Process.nextTick
的代码,另一个在 JS 引擎中运行 promise 回调,如果没有,那么它们是如何安排的,因为没有 setTimeout 和Process.nextTick
定义在 JS 引擎中,但 Promise 定义必须存在于 JS 引擎中,因为 Promise 是 ES6 标准。
我还想了解任务队列、作业队列、微任务的存在和管理位置,内部 JS 引擎或外部引擎(在浏览器或 Node API 中)。
最佳答案
主要的两个js运行引擎:
- 浏览器
- Node (V8)
在浏览器(谷歌浏览器)中:
宏任务:
- 设置超时
- 设置间隔
微任务:
- promise
执行顺序:
Promise> Promise.then> setTimeout
在 nodejs 运行时:
微任务:
- process.nextTick
- promise
宏任务:
- 设置超时
- 设置间隔
- 立即设置
- 输入/输出
执行顺序:
promise> process.nextTick> promise.then > setImmediate> setTimeout
很多关于事件循环的文章。给你一些引用,帮助你了解理论:
关于javascript - JS 引擎或浏览器/Node 外部 API 如何安排 promise 回调与 setTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292733/