附加不同 Promise 链时 JavaScript Promise 的执行顺序

2024-04-24

我想检查一下promise对象通过创建一个promise并传递给其他人并让其他人附上then到它。输出与我的预期相去甚远,我不明白它是如何执行的。

const wait = time => {
  return new Promise((res, rej) => {
    setTimeout(res, time);
  });
};

const promise = wait(5000)
  .then(() => console.log('1'));

promise
  .then(() => console.log('2'))
  .then(() => console.log('3'));

promise
  .then(() => console.log('4'))
  .then(() => console.log('5'));

output:

1
2
4
3
5

我调试了代码,这是我观察到的。呼叫wait(5000)调用构造函数Promise那个叫setTimeoutAPI 通过传递res回调和Promise对象被返回。然后它开始注册所有then按相同顺序从 1 到 5。 5秒后它调用res from Promise调用承诺链的对象。

在我脑海里,thenAPI 添加了所有callbacks到一个数组或类似的东西,从 1 到 5 一次res被调用它开始调用callbacks从应该生成日志的数组中逐一(FIFO)1 2 3 4 5 not 1 2 4 3 5.

为了将它们注册到主目录,这是如何不执行的promise?


首先,当你这样做时:

promise.then(...).then(...)

附上一个.then()处理程序到promise和第二个.then()附有一个新的承诺,即第一个.then()返回。

所以,当promise解决了,第一个.then()计划在事件循环的下一个周期触发。然后,仅当第一个.then()完成后,它安排第二个.then()在事件循环的下一个刻度处触发(它不会在事件循环的此刻度处运行)。

当你这样做时:

promise
  .then(() => console.log('2'))
  .then(() => console.log('3'));

promise
  .then(() => console.log('4'))
  .then(() => console.log('5'));

然后,当promise解决,then(2) and then(4)这是仅有的两个.then()这段代码中的处理程序直接附加到promise计划在事件循环的下一个时钟周期运行。在下一个刻度时,首先then(2)运行然后then(4)运行。由于它们都附加到相同的 Promise,因此它们以 FIFO 方式运行,第一个附加的首先运行。什么时候then(2)运行,它安排then(3)在事件循环的下一个刻度处运行then(4)运行,它安排then(5)在事件循环的下一个时钟周期运行。

所以,两者之后then(2) and then(4)已经运行,在事件循环的下一个刻度处,您将看到then(3) and then(5)运行并解释了您在控制台中看到的顺序:

1
2
4
3
5

我想你对此并不感到惊讶then(1)首先运行,所以我没有将其添加到解释中。

为了将它们注册到主要承诺中,这是如何不执行的?

他们三个.then()处理程序直接附加到promise请按照它们附加的顺序运行。显然让你感到困惑的是,链式.then()处理程序不直接附加到promise,但是新的承诺promise.then()返回。

.then()返回一个新的承诺,因为它可能不会立即解决。如果回调里面.then()本身返回一个承诺,然后这个承诺.then()退货并不能立即解决。必须等到承诺.then()返回的回调也解决了。

在我看来,API 将所有回调添加到一个数组或类似的东西中,从 1 到 5,一旦调用 res,它就会开始从数组中一一调用回调(先进先出),这应该会生成日志 1 2 3 4 5 而不是1 2 4 3 5。

嗯: 1、2 和 4 确实被添加到同一个数组中.then()处理程序回调promise目的。但是,如上所述,3 和 5 是由不同的 Promise 创建的.then()他们被束缚着。所以,1、2、4都是按先进先出执行的。但是 3 和 5 被延迟到事件循环的后续滴答。

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

附加不同 Promise 链时 JavaScript Promise 的执行顺序 的相关文章

  • 对 JavaScript 中的 while 循环感到困惑

    我可能在这里有点厚重 但请回答我这个问题 考虑以下代码 a 1 while a lt 6 console log a a 如果我运行这个 我会在控制台中得到从 1 到 6 的值 然后是另一个 6 现在看看这个 a 1 while a lt
  • npm install -D sass-loader node-sass Vue.js 2021

    您好 问题是为 Vue js 设置 SASS 我跑 Node js 15 7 0 Vue js vue cli 4 5 11 这是我在运行此命令时在控制台中遇到的错误 npm install D sass loader 节点 sass np
  • 如何最好地实现多个重叠元素的翻转和推出事件?

    Problem 我正在开发一个网站 其中有一个 拨号盘 显示代表伞式公司不同部门的多个选项卡 目前我已经用 HTML CSS 准备好了一切 每个选项卡的定位 内圈处于较高位置z index因为选项卡在滚动时需要向外动画 我可以实现这部分 选
  • 避免 AngularJS 部分视图在 IE 中缓存

    我正在开发一个 ASP NET MVC 应用程序 它也有一些 angularJS 我有一个主页 其中有不同的选项卡 当您单击它们时 它们会加载角度部分视图 主页是这样的 div class widget div div class widg
  • 将服务连接到现有的流星帐户

    我正在设置一个流星应用程序 其中涉及使用用户名和密码进行注册 然后希望将该帐户与 Facebook 和 Twitter 连接起来 我只需使用帐户包即可轻松启动并运行第一部分 但是当我有一个登录用户调用 Meteor loginWithFac
  • RxJS - 从可观察对象中获取最后 n 个元素

    我想从可观察对象中获取最后 3 个元素 假设我的时间线是这样的 a b c d e f g h i j gt where a b c d e f g h i j are emitted values 每当发出新值时 我想立即获取它 因此它可
  • 日期时间的自定义 JavaScriptConverter?

    我有一个对象 它有一个 DateTime 属性 我想通过 AJAX JSON 将该对象从 ashx 处理程序传递回网页 我不想使用第 3 方控件 当我这样做时 new JavaScriptSerializer Serialize DateT
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • Typeahead.js 干扰 Bootstrap 输入组

    如何防止 Typeahead js 拆分我的 Twitter Bootstrap 3 输入组 每当我将 Typeahead javascript 指向属于输入组一部分的文本区域时 连接的文本区域和提交按钮就会停止连接 这只是 Typeahe
  • 替换 Javascript 中的引号?

    对于我正在制作的网络应用程序 我将收到文本字符串 其中偶尔包含引号 因为我接下来要 document writing 字符串 所以需要将它们更改为撇号或转义 我该怎么做 因为当我尝试时它似乎不起作用 特别是我认为因为字符串的引号阻止了脚本的
  • 如何在流程图中间隔刻度线?

    我下面有一个流程图 您将看到标签被压缩 我想使刻度之间的宽度确保显示所有标签 标记如下 div div class graph info a href span span a a href class active span span a
  • CKEditor TypeError:c[a] 在 CodeIgniter 中未定义

    我正在尝试在基于 codeigniter 的网站中安装 CKEditor 并且我已按照本教程进行操作 Codeigniter 教程中的 CKEditor http nukium com developpement php framework
  • 如何在变量名中使用变量

    所以我正在使用这样的 json 变量 opponentInvData item1 它包含项目 1 到 6 我需要动态访问不同的项目并将它们设置为空 itemNum 是我需要访问的特定项目 我正在尝试使用 eval 函数 var itemNu
  • 如何检查摘要周期是否稳定(又名“Angular 完成编译了吗?”)

    tl dr 最初的问题是 如何在每个摘要周期触发回调 但潜在的问题更有趣 因为这回答了两个问题 所以我继续修改了标题 Context 在解决了所有依赖项 nginclude API 调用等之后 我试图控制 Angular 何时完成 HTML
  • 在javascript中定义Date.parse的格式[重复]

    这个问题在这里已经有答案了 我正在使用 Date parse 将字符串转换为 JavaScript 中的日期 但是 如果字符串看起来像 10 11 2016 它会被解释为 2016 年 10 月 11 日 我需要将其解释为 2016 年 1
  • 可选链接在 create-react-app 中不起作用

    In a create react app项目 我正在使用 babel plugin proposal optional chaining在我的 babelrc中 但是 我有这个错误 Module parse failed Unexpect
  • 如何在 Javascript 中将字符串数组转换为特定的树结构

    我从后端获取文件路径列表 它代表文件夹结构 如下所示 paths path to file1 doc path to file2 doc foo bar doc 路径的长度是任意的 为了使用文件树组件 角度2树组件 https github
  • addEventListener keydown 不起作用

    我在互联网上找到了一些基本的 Pong 代码 并尝试添加按键 代码在这里 http cssdeck com labs ping pong game tutorial with html5 canvas and sounds http css
  • 将元素添加到 D3 圆包节点

    我正在尝试制作一个可缩放的圆形包装图 我希望每个子圆圈包含一个较小的图表 该图表始终具有相同的结构 即 4 列 只有条形的高度会改变 我尝试添加一个简单的rect到目前为止我的图表 但矩形没有添加到圆圈中并且是静态的 JS var marg
  • Javascript:修改原型不会影响现有实例[重复]

    这个问题在这里已经有答案了 我创建了原型的 2 个实例 更改了原型中的函数 更改反映在两个实例中 很棒 但是 当我通过删除该函数来修改原型时 该函数对于现有实例仍然存在 function A this name cool A prototy

随机推荐

  • CALayer框架origin.y翻转,0在底部?

    当我在 CALayer 上添加一组 fram 时 origin y 会反转 0 位于其超级层的底部 增加 origin y 将其在其超级层中向上移动 我做了什么事情导致了这个翻转吗 我希望 origin y 0 是顶部 而不是底部 Than
  • 0x80005000 UserPrincipal.GetGroups 上的未知错误,OU 中包含特殊字符

    我正在尝试使用 UserPrincipal 的 GetGroups 方法 如果用户帐户位于包含正斜杠的 OU 中 则对 GetGroups 的调用将失败并出现 COM 未知错误 0x80005000 刚刚找到用户帐户 我可以访问其他属性 如
  • Node.js 和 Express 应用程序中的 res.render() 和 ejs.render() 有什么区别

    I use EJS https github com visionmedia ejs我的 Node js 和 Express 应用程序中使用了模板引擎 并且到目前为止已经使用了它的功能和渲染 并且到目前为止还没有出现任何问题 然而 虽然我总
  • 改进 cvFindChessboardCorners

    不幸的是 我无法找到我的问题的任何解决方案 我想做的是使用 OpenCV 方法改进结果cvFindChessboardCorners为了能够实现更好的相机校准 因为我认为这就是为什么我在不扭曲 校正图像时得到较差结果的原因 就像我之前的问题
  • Google 我的商家 API 发现网址不起作用

    我有一段 Python 代码 直到几周前 2021 年 10 月 仍在与 Google My Business API 配合使用 discovery url https developers google com my business s
  • 从网站获取数据的vba代码

    我是这个网站和 VBA 编程的新手 我遇到了一个问题 我必须从中获取数据这一页 http www kieskeurig nl zoeken index html q 4960999543345 我需要有超链接网址Check Rates 10
  • 将三个列表合并到一个字典中

    我需要将三个列表合并到一本字典中 这些列表来自读取我格式化的 txt 文件 以下是该文件的片段 maker Horsey Ford Overland Scripps Booth year 1899 1909 1911 1913 model
  • 使用 .htaccess 在 HTTP 和 HTTPS 之间正确切换

    我们有一个购物网站 托管在共享主机 Mediatemple Gridserver 上 网站的某些部分需要使用 HTTPS 结帐等 但其余部分应使用 HTTP 有谁知道我们如何始终强制对特定 URL 正确使用 HTTP HTTPS 我们已经让
  • SQL 查询返回与同一表的另一列中的精确值匹配的单个值

    Table Dummy Colum1 Colum2 219 217 219 218 228 218 228 225 229 218 229 220 我需要结果集 其中如果用户在 where 子句中提供的数字应该与其计数示例完全匹配 如果用户
  • 使用主干渲染引导模式

    我认为代码可以更好地解释我的问题 风景 App Views ErrorModal Backbone View extend template window template errorModal render function this e
  • Knockout.js、映射插件和 moment.js - 格式化/映射 json 日期

    我将 Knockout js 与映射插件一起使用 我正在获取一些 json 数据并使用映射插件将其映射到我的 html 中 json 数据中是 json 格式的日期 我需要使用映射插件将其映射到 html 中 是否可以使用 moment j
  • iOS - 异步图像下载

    我正在编写一个应用程序 它将在 UIImageView 中显示在我的服务器上找到的图像 我需要一些能够异步下载图像并缓存它的东西 同时将其放入 UIImageView 中 当我按下按钮时 下载也需要能够取消 谁能指出我可以做到这一点的方向吗
  • 为什么 JVM 同时具有“invokespecial”和“invokestatic”操作码?

    两条指令都使用静态而不是动态调度 似乎唯一的实质性区别是invokespecial始终将一个对象作为其第一个参数 该对象是分派方法所属类的实例 然而 invokespecial实际上并没有把物体放在那里 编译器负责通过在发出之前发出适当的堆
  • 视图“~/Views/Login/Login.aspx”必须派生自 ViewPage、ViewPage、ViewUserControl 或 ViewUserControl

    因此 我在 ASP NET mvc2 解决方案上遇到此错误 该解决方案曾经工作正常 我必须安装 Visual Studio 2012 但磁盘空间不足 因此必须手动卸载一些 Visual Studio 2010 功能 但目前看来并非完全必要
  • 嵌套的可分割对象不读取

    我正在尝试打包一个包含一些 string int 变量和一个对象变量的对象 字符串和整数可以工作 但嵌套对象不行 我知道我也必须将其打包 但我显然做错了 在我的嵌套类中 writeToParcel方法被调用 我检查Log d 调用 但是cr
  • Javascript:如何实现异步函数队列(无需库)

    我一直在搜索谷歌和SO 但由于某种原因我很难解决这个问题 只是强调一下 我不想加载像 JQuery 这样的库 因为我不需要它的大部分内容 当我could使用动画库 我已经构建了我自己需要的几个函数 其中一些甚至不是您在库中找到的标准动画 所
  • 用于 SQL 更新语句的 Java 单工作线程

    我正在开发一个基于 Java 的服务器 其中有多个线程 每个连接的用户一个线程 一些额外的线程 会涉及到一些数据库连接 所以我在想服务器每次创建一个SELECT查询数据库时 它将为此启动一个新线程 以防止当前线程阻塞 我计划为此使用连接池
  • 当我尝试打开我的网络应用程序(在本地主机上运行)时,Heroku 给出了 503

    我正在尝试部署到heroku 但即使它在本地主机上运行 也会得到503 我很好奇我的服务器是否设置正确 因为我是编程新手 我希望任何人都可以为我指出正确的方向 即在哪里查找或提供建议 因为我在谷歌上花费了无数个小时 跨越了几周的时间 我的主
  • 如何在C中访问正确的全局变量?

    假设我在 main c 中有一些全局变量 GLOBAL 但我的 main c 有一个 include other h 但 other h 也有全局变量 GLOBAL 当我在 main c 中写 GLOBAL 时 如何让编译器知道我的意思是哪
  • 附加不同 Promise 链时 JavaScript Promise 的执行顺序

    我想检查一下promise对象通过创建一个promise并传递给其他人并让其他人附上then到它 输出与我的预期相去甚远 我不明白它是如何执行的 const wait time gt return new Promise res rej g