JavaScript Promise 中的执行顺序是什么?
问题:
以下代码片段演示了 JavaScript 的使用Promise,而且执行顺序很耐人寻味。
<code class="javascript">Promise.resolve('A') .then(function(a){console.log(2, a); return 'B';}) .then(function(a){ Promise.resolve('C') .then(function(a){console.log(7, a);}) .then(function(a){console.log(8, a);}); console.log(3, a); return a;}) .then(function(a){ Promise.resolve('D') .then(function(a){console.log(9, a);}) .then(function(a){console.log(10, a);}); console.log(4, a);}) .then(function(a){ console.log(5, a);}); console.log(1); setTimeout(function(){console.log(6)},0);</code>
结果表明执行顺序是:
1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6
提出的问题是为什么执行顺序不是 1, 2 , 3, 4...,1, 2, 3, 4... 的期望与结果有何不同?
答案:
注释:
在 .then() 处理程序中运行 Promise,而不从 .then() 回调返回它们,会创建一个新的、独立的 Promise 序列,该序列不与任何父 Promise 同步。方式。这通常被认为是一个错误,一些承诺引擎在发生时会发出警告,因为它通常不是预期的行为。一个有效的用例可能是“即发即忘”操作,其中既不关心错误,也不关心同步。
.then() 处理程序中的 Promise.resolve() Promise 创建独立于父级运行的新 Promise 链链。对于实际的异步操作(例如 AJAX 调用),独立的、断开连接的 Promise 链没有可预测的行为。完成时间是不确定的,就像并行启动四个 AJAX 调用,但完成顺序未知。在提供的代码中,所有操作都是同步的,从而产生一致的行为,但不应依赖这一点,因为 Promise 的设计目的是异步执行。
总结:
- 所有 .then() 处理程序在当前执行线程完成后异步调用。这种一致性包括同步解决的 Promise,例如 Promise.resolve().then(...),以防止计时错误。
- setTimeout() 与计划的 .then() 处理程序没有指定的顺序。虽然所使用的实现将挂起的 .then() 处理程序放置在挂起的 setTimeout() 之前,但 Promises/A 规范允许在 setTimeout() 之前或之后进行调度。
- 独立的 Promise 链没有可预测的执行顺序。
- 如果执行顺序至关重要,请避免创建依赖于微小实现细节的竞争。相反,链接 Promise 链以强制执行特定顺序。
- 避免在 .then() 处理程序中创建独立的 Promise 链,除非是“即发即忘”场景。
逐行分析:
- 初始 Promise 链已启动,并附加了 .then() 处理程序。由于 Promise.resolve() 立即解析,因此第一个 .then() 处理程序计划在当前 JavaScript 线程完成后运行。后续 .then() 处理程序位于第一个处理程序之后的顶级链中,并且仅在第一个处理程序完成后执行。
- setTimeout() 在执行线程的末尾运行,并安排一个计时器。
- 同步执行完成后,事件队列运行剩余的任务。
- 第 1 行中定义的 .then() 处理程序执行,并记录 '2 "A"'。
- 调用后续的 .then() 处理程序,并创建一个新的独立 Promise 链,其中的 .then() 处理程序计划在当前执行线程完成时运行。该处理程序在子链的 .then() 处理程序运行之前打印 '3 "B"',后者打印 '7 "C"'。
- 然后调用第 12 行中定义的 .then() 处理程序,并且再次创建一个新的 Promise 链,调度一个 .then() 处理程序。从此处理程序记录“4 "B"”。
- 子链中预定的 .then() 处理程序运行,打印“8 undefined”。
- .then() 处理程序随后调用第 19 行中定义的内容,并创建另一个独立的 Promise 链,调度 .then() 处理程序。从此处理程序打印 '5 undefined'。
- 最后,调用第 15 行中定义的 .then() 处理程序,并打印 '10 undefined'。
- 执行 setTimeout()
结论:
.then() 处理程序中的 Promise.resolve() 承诺执行缺乏特定的顺序,以及各种引擎的 .then() 处理程序调度与 setTimeout() 的不确定性,突出了通过链接承诺控制执行顺序的重要性。
以上是为什么 Promise 执行顺序与 JavaScript 中的期望不匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 Linux新版
SublimeText3 Linux最新版