javascript - JS 引擎或浏览器/Node 外部 API 如何安排 promise 回调与 setTimeout?

标签 javascript node.js promise settimeout event-loop

我在问题的两个不同部分考虑整个 JS 环境。

  1. JS引擎
  2. 浏览器 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)

浏览器(谷歌浏览器)中:

javascript event-loop in browser

宏任务:

  • 设置超时
  • 设置间隔

微任务:

  • promise

执行顺序:

Promise> Promise.then> setTimeout

nodejs 运行时:

nodejs event-loop

微任务:

  • process.nextTick
  • promise

宏任务:

  • 设置超时
  • 设置间隔
  • 立即设置
  • 输入/输出

执行顺序:

promise> process.nextTick> promise.then > setImmediate> setTimeout

很多关于事件循环的文章。给你一些引用,帮助你了解理论:

关于javascript - JS 引擎或浏览器/Node 外部 API 如何安排 promise 回调与 setTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292733/

相关文章:

javascript - 为什么字符串有时会在 javascript 中更改为数​​字?

javascript - 在jsp页面上使用jquery ajax获取json数据

javascript - npm 错误! 404 未找到 npm 错误!不好 代码 0

javascript - JS Promise 在函数之间传递/等待 Promise

javascript - 如何用函数改变变量的值?

node.js - 在 Node.js 中使用 Let's Encrypt 证书最安全的方法是什么?

javascript - Node.js - 使用每秒 5 个请求的 API 限制

node.js - 没有向 pbkdf2 提供回调

javascript - 按顺序执行Promise : understanding a claim made about this example code

node.js - Node 等待 Promise.all() 完全解决