JS 引擎或浏览器/节点外部 API 如何安排承诺回调与 setTimeout?

Aks*_*aik 5 javascript event-loop settimeout node.js promise

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

  1. JS引擎
  2. 浏览器 API、节点 API(JS 引擎外部)。

JavaScript 引擎(V8、SpiderMonkey)是单线程的,在 ES6 之前,在 ES6 引入 Promise 概念之前,没有在 JavaScript 中运行异步代码的机制。

我了解在 promises 出现之前,浏览器或 Node API(服务器端 JS)用于提供异步运行代码的机制,setTimeout and Process.nextTick并且由于 Promises 原生支持在 Javascript 中运行异步代码,我试图了解 promise 回调和 setTimeout 是如何实现的计划先运行一个。

这是否意味着存在两个事件循环并且它们相互协调?首先在浏览器/节点 API 中运行代码setTimeout and Process.nextTick,另一个在 JS 引擎中运行承诺回调,如果没有,那么它们是如何调度的,因为setTimeout and Process.nextTickJS 引擎中不存在定义,但 JS 引擎中必须存在 Promise 定义,因为 Promise 是 ES6标准。

我还想了解任务队列、作业队列、mircotasks 在哪里存在和管理,在 JS 引擎内部或外部引擎(在浏览器或 Node API 中)。

duk*_*god 3

主要有两个js运行引擎:

\n\n
    \n
  • 浏览器
  • \n
  • 节点js(V8)
  • \n
\n\n

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

\n\n

浏览器中的javascript事件循环

\n\n

宏任务:

\n\n
    \n
  • 设置超时时间
  • \n
  • 设置时间间隔
  • \n
\n\n

微任务:

\n\n
    \n
  • 承诺
  • \n
\n\n

执行顺序\xef\xbc\x9a

\n\n
Promise> Promise.then> setTimeout\n
Run Code Online (Sandbox Code Playgroud)\n\n

nodejs运行时:

\n\n

Node.js 事件循环

\n\n

微任务:

\n\n
    \n
  • process.nextTick
  • \n
  • 承诺
  • \n
\n\n

宏观任务:

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

执行顺序\xef\xbc\x9a

\n\n
promise> process.nextTick> promise.then > setImmediate> setTimeout\n
Run Code Online (Sandbox Code Playgroud)\n\n

很多关于事件循环的文章。给你一些参考资料来帮助你了解理论\xef\xbc\x9a

\n\n\n