在 Nodejs 事件循环的哪个阶段解析 Promise 的回调被执行?

2023-12-25

根据这个答案 https://stackoverflow.com/a/57325561 :

“重要的是考虑到然后/赶上 Promise 中的回调是微任务,将在之后执行 下一步勾选任务”

Nodejs 文档提到 nextTickQueue 将在当前操作完成后处理,无论事件循环的当前阶段如何。这是否意味着已解决的承诺回调既不会在轮询阶段执行,也不会在挂起的回调阶段执行?

Also, 这个视频 https://www.youtube.com/watch?v=6YgsqXlUoTM提到有一个queueMicroTask队列,它在事件循环的当前阶段之后进行处理。所以我现在明白的是:

已解决的 Promise 回调将添加到queueMicroTask中,该回调将在nextTickQueue(回调传递给process.nextTick)之后进行处理,无论事件循环的当前阶段是什么,都会在nextTickQueue之后进行处理。

那是对的吗?如果不对请纠正我,我真的很困惑。


微任务和 nextTicks 有一个重要的语义,这取决于 Node 版本。

在 Node v11 之前,nextTick 队列在事件循环的每个阶段之间执行(计时器、I/O、立即数、关闭处理程序是四个阶段)。因此,在 Node v11 之前,promise 回调也在事件循环的每个阶段之间执行。 (我在这里详细写了这一点:https://blog.insiderattack.net/promises-next-ticks-and-immediates-nodejs-event-loop-part-3-9226cbe7a6aa https://blog.insiderattack.net/promises-next-ticks-and-immediates-nodejs-event-loop-part-3-9226cbe7a6aa)

然而,从 Node v11 开始,事件循环跳转到microtask每当有一个队列microtask作为程序执行的一部分添加到微任务队列中。您可以使用以下代码片段进行实验。这同样适用于 nextTick 队列。你可以在这里阅读更多:https://blog.insiderattack.net/new-changes-to-timers-and-microtasks-from-node-v11-0-0-and-above-68d112743eb3 https://blog.insiderattack.net/new-changes-to-timers-and-microtasks-from-node-v11-0-0-and-above-68d112743eb3

setImmediate(() => console.log('timeout1'));
setImmediate(() => {
    console.log('timeout2')
    Promise.resolve().then(() => console.log('promise'))
});
setImmediate(() => console.log('timeout3'));
setImmediate(() => console.log('timeout4'));

上述代码的输出根据 Node.js 版本的不同而变化,如下所示:

$ node -v
v10.19.0
$ node test.js    
timeout1
timeout2
timeout3
timeout4
promise

$ nvm use 11
Now using node v11.15.0 (npm v6.7.0)
$ node test.js        
timeout1
timeout2
promise
timeout3
timeout4

因此重要的是要知道: nextTicks and microtasks在 Node 版本 >=11 中具有更高的优先级,因为它们有机会在事件循环的当前阶段内进行处理。但在早期的 Node 版本中,nextTicks and microtasks在循环的每个阶段结束时执行。

顺便说一句,重要的是要知道microtasks队列是的一部分v8引擎并且不在 Node.js 运行时维护。然而,Node.js 事件循环指示v8运行所有microtasks,一旦 Node.js 完成nextTick队列。因此,promise 回调会在之后执行nextTick queue.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Nodejs 事件循环的哪个阶段解析 Promise 的回调被执行? 的相关文章

  • 预计来电次数:>= 1 已接来电次数:0

    我正在学习带有钩子的reactjs表单 现在我想使用jest和enzyme测试提交时的表单 这是我的登录组件 import React from react function Login const email setEmail useSt
  • 纯函数可以异步吗?

    在浏览纯函数的定义时 它通常定义有两个特征 1 给定相同的输入应该产生相同的输出 2 不应产生任何副作用 这是否也意味着纯函数不应该是异步的 如果不是 怎么会这样 如果是的话 我很想看到 JavaScript 中异步纯函数的一些示例 是的
  • 如何使用 OR 逻辑(而不是 AND)过滤表列

    小提琴示例 http jsfiddle net fks37 我有一个 html 表 A B C D 0 1 0 1 0 1 0 0 1 0 0 1 我要过滤non zero列 使用 jQuery dataTables 不是硬性要求 只是我当
  • 同步迭代 javascript 对象

    我有一个像这样的对象 let myObject db1 db1 file1Id db1 file2Id db 1file3Id db2 db2 file1Id db2 file2Id 我遍历这个对象并在每次迭代中 我连接到数据库 检索文件
  • 将声音添加到标记数组 - 谷歌地图 javascript

    我是新来的 所以我知道我没有任何可信度 我是一名艺术家 对编程很陌生 所以我理解是否没有人会承担这个任务 我发布这篇文章是因为这是一个简单的问题 S 这是创建多个标记的代码 主要来自谷歌开发者网站 它工作正常并为每个标记创建一个自定义图标
  • 通过排队预加载图像?

    我正在寻找一种预加载特定图像并将其添加到队列中的方法 这是我目前所处的位置 http shivimpanim org testsite imageloader html http shivimpanim org testsite image
  • NodeJS + Express + Mongo 会话存储

    我目前在尝试在 MongoDb 中存储会话时遇到了很大的麻烦 我尝试过express session mongo和connect mongodb 当我尝试加载登录页面时 两者都给出了相同的 500内部服务器错误 这让我觉得也许在某个地方与
  • Typescript,返回元组的通用可变参数工厂函数

    在打字稿中 可以像这样创建工厂函数 并定义返回类型 function factory1
  • Iron 路由器中的多个订阅

    我一直在开发一个使用评论功能的应用程序 这导致必须订阅发表评论的集合和评论集合本身 现在看起来像这样
  • 量角器未连接到 DevTools

    当我的页面从 Protractor 运行时 如何使用 Chrome 开发者工具来检查它 当我尝试打开开发工具时 我从量角器收到此错误 UnknownError disconnected not connected to DevTools S
  • 强制上下文

    我有一个类 其中有一个私有属性和一个公共访问方法 Person function this Name asd var public new Object public Name function value if value undefin
  • 如何在 d3.scale.ordinal() 中指定域?

    var W 100 var H 200 var data v 4 v 8 v 15 v 16 v 23 v 42 var x d3 scale linear domain 0 max x range 0 W var y d3 scale o
  • 在 TypeScript 中使用三个 Js + OrbitControl

    我无法得到this http www example com 在 TypeScript 中使用上述组合的示例 I have and 在我的html中和打字稿文件
  • 解码URIComponent抛出错误“URI格式错误”

    As unescape已被弃用 我已选择decodeURIComponent 但它没有按预期工作 decodeURIComponent无法解码以下 URI 组件 Coast 20Guard 20Academy 20to 20hold 20a
  • PapaParse 与 Angular JS

    喜欢 PapaParse 漂亮的 CSV 解析器和解解析器 任何人都可以帮助我将其与 Angular JS 结合起来吗 我喜欢让 PapaParse 以 Angular 方式工作 正在尝试解决方案 实际上我没有做任何花哨的事情来加载它 只需
  • 需要帮助在 D3.js 条形图中将 x 轴刻度与条形对齐

    我有一个可用的线性条形图D3 js http d3js org 它也有基于时间的 x 轴 条形图绑定到计数属性 而轴绑定到日期属性 轴上的刻度未与条形对齐 知道如何将它们两者排列起来吗 这是 jsFiddle http jsfiddle n
  • React-Router v4 渲染错误的组件但匹配正确

    我有一个带有两个按钮的侧边栏 测试 和 关于 Test 火箭图标 呈现在 test 处 About 主页图标 呈现在 处 它们都位于应用程序的根目录并嵌套在组件内 当我从 开始并单击 链接到 test 时 它总是加载 关于 组件 当我检查
  • 在 JavaScript 中,将 NodeList 转换为数组的最佳方法是什么?

    DOM 方法document querySelectorAll 和其他一些 返回一个NodeList 对列表进行操作 例如使用forEach the NodeList必须首先转换为Array 转换的最佳方式是什么NodeList to an
  • JavaScript Intellisense 在 Visual Studio 2015 中不起作用

    我知道这个问题在网上以及整个网络上都有很多重复的问题 不幸的是 所提出的建议都不起作用 除了重新安装 VS 15 之外 我已经完成了所有操作 如果我可以帮助的话 我宁愿不这样做 我去过的一个网站 references js 背后的故事 ht
  • setInterval 会导致浏览器挂起吗?

    几年前 我被警告不要使用setInterval很长一段时间 因为如果被调用的函数运行时间超过指定的时间间隔 可能会导致浏览器挂起 然后无法跟上 setInterval function foo bar i 1 现在 我知道在循环中添加大量代

随机推荐

  • 如何在Python内部列表中运行嵌套循环,以便外部循环始终从列表的下一个元素开始,依此类推

    我有一个类似的列表 16777230 0 16777226 1 16777252 2 16777246 0 我想在 python 中的操作的循环 嵌套循环 内创建一个循环 以便内部循环始终从外部循环的下一个元素开始 例如 外循环将在每次迭代
  • '(' 或 '[' 预期

    尝试编译我的程序时出现以下错误 预期为 或 public AccountArrayList line one below is the hi lighted code ArrayList accounts new ArrayList acc
  • Python 模块初始化

    在模块代码中初始化模块中的对象是不好的做法吗 in Module py class Foo object def init self self x Foo Foo Foo 与用户代码相比 您可以 gt gt gt from Module i
  • 同时支持 Android 和 Android TV 的 Android Studio 项目

    我正在尝试创建一个同时支持 Android 手机 平板电脑 和 AndroidTV 的 AndroidStudio 项目 目标是在手机 平板电脑和 AndroidTV 上拥有类似的功能 同时不需要另一个来操作 并重用代码 当我创建一个新项目
  • 在 iPhone 上的 iOS Safari 中访问相机

    I have 单页网络应用程序 SPA 那个verifies用户作为注册过程的一部分 验证的一部分是捕获selfie用户的 为此 我实现了以下代码的一个版本来获取camera输入到一个video网页上的元素 然后我可以从中sample图像转
  • 如何在添加数据后调整android webview的大小

    在布局 线性 垂直 层次结构中 我有多个视图 其中之一是 WebView 它们都有相同的参数 android layout width fill parent android layout height wrap content 对于所有视
  • c++filt 不会分解 typeid 名称

    我正在 GCC 上运行代码C 编译器 输出 type info name include
  • SQLException:等待空闲的可用连接超时

    我正在用 java 构建一个应用程序Play Framework 2 0 4 该应用程序部署在heroku使用cleardb数据库 用户不断收到此偶尔的错误 PlayException Execution exception Persist
  • WPF 应用程序中的 IIS 平滑流处理

    我怎样才能玩IIS 平滑流式传输 http www iis net expand SmoothStreamingWPF 应用程序中的视频 我知道 Silverlight 对其有内置支持 但我找不到 WPF 的太多信息 会不会MediaEle
  • 为什么 grid-gap 会改变 CSS Grid 中列的宽度?

    使用 css grid 我在容器内设置了一个 1002px 宽的 24 列网格 在容器 div 内 有一个跨 21 列的子 div 我期望子 div 的宽度是 21 24 1002 876 75 当添加 grid gap 属性时 列的宽度减
  • 连续 GA 命中率下降

    我想使用 Google 分析和本地存储跟踪离线事件 这是我的代码 var gaq gaq gaq push setAccount UA 27966345 1 gaq push setDomainName none gaq push setS
  • 使用正则表达式匹配电视和电影文件名

    我一直在努力获取正则表达式来从视频文件名中获取电视节目或电影名称 播出年份 如果存在 季节 和剧集 我有一个正则表达式 如下 似乎对于电影和电视节目具有双年日期的节目 其中一个年份是节目 电影名称 另一个是它播出的年份 很有效 对于电视节目
  • 不支持的列数据类型 ODP.NET

    我正在尝试将基于 ODP NET 11g 构建的现有应用程序升级到 ODP NET 12c 希望它能够提高数据库调用和数据检索的性能 在这方面 我安装了最新的ODP NET 12c 并将所有Oracle项目引用更改为指向最新的Oracle
  • 当 Debug = False 时,Django 应用程序在本地主机上收到服务器错误 500

    我的 django 应用程序运行正常 没有任何错误 Debug True in 设置 py 但是当我将其切换到Debug False I get 服务器错误 500 另外我得到 HTML 文档的字符编码未声明 如果文档包含 US ASCII
  • Grails:request.JSON 从哪里来?如何使用 jQuery 的 .ajax() 或 .post() 将内容放在那里?

    我有一个控制器 它需要一些 json 请求正文 并用它做一些很棒的事情 def myController def myAction println Here is request JSON request JSON as JSON prin
  • 使用 babel 的简单 ES7 装饰器

    我无法运行此代码 https www npmjs com package core decorators readonly https www npmjs com package core decorators readonly 我使用 g
  • 关闭工作簿时的 VBA Excel 操作[重复]

    这个问题在这里已经有答案了 当有人关闭文件时 是否可以自动让 Excel 执行操作 情况 我有一个 Excel 文件 其他几个人也使用该文件 该文件在保存时发布一个 mhtml 文件 此 mhtml 文件将使用昨天的日期保存 如 Dashb
  • Rails 邮件程序内嵌附件错误

    我在 Action Mailer 中有一个非常罕见的行为 我在 5 个月前实施了一个邮件操作 它正在工作 但昨天 由于某种奇怪的原因 它崩溃了 问题 我有一个邮件布局 为了在我的所有电子邮件中使用它 我在其中渲染了之前由之前过滤器附加的图像
  • Mysql返回多行

    我有这个疑问 SELECT notes id enter name as enter name step title as flow status notes user name as user created notes created
  • 在 Nodejs 事件循环的哪个阶段解析 Promise 的回调被执行?

    根据这个答案 https stackoverflow com a 57325561 重要的是考虑到然后 赶上 Promise 中的回调是微任务 将在之后执行 下一步勾选任务 Nodejs 文档提到 nextTickQueue 将在当前操作完