【问题标题】:Javascript Promise Guarantees - Javascript Event LoopJavascript Promise 保证 - Javascript 事件循环
【发布时间】:2019-03-22 05:11:32
【问题描述】:

在 Mozilla Promise 文档中,有一个保证部分:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Guarantees

它包含以下语句:

与“老式”的传入回调不同,promise 带有一些保证:

在当前完成之前永远不会调用回调 JavaScript 事件循环的运行。

这对我来说很有意义,并且是我所期望的行为,但我正在寻找一些支持此“保证”的其他文档。

是否有某种规范明确记录/要求这样做?这对于提供本机 Promise 实现的任何 javascript 运行时是否有保证?它是狂野的西部,你不能依赖它,等等。

【问题讨论】:

标签: javascript es6-promise


【解决方案1】:

是否有某种规范明确记录/要求这样做?

promise 库使用的规范是 promise A+ 规范。这个特殊要求是number 2.2.4。您使用的几乎所有承诺库都会遵守这一点,但如果您需要检查这一点,有tests which can verify compliance with the spec

更重要的是,既然 Promise 是语言的一部分,原生 Promise 受 ECMAScript 规范的约束。 Promise 首次在 2015 版中引入,section 25.4。截至本答案发布时,最新完成的版本是2018 edition。您询问的具体行为是由于管理 .then 方法的部分 (found here) 和有关 triggerPromiseReaction 的部分 (found here)。其中每个依次引用 enqueueJob 操作 (found here)

【讨论】:

  • ECMAScript 的行为受 ECMAScript 规范的约束,而不是 Promises/A+,前者没有提及后者。所以你问题的后半部分是至关重要的部分。
  • 另外,ES2015 可能是描述 Promise 的规范的第一版,但它已经被更新的版本取代了 3 次。您可能想参考当前的规范规范。
  • 谢谢,我已将您的两个反馈都纳入了 :)
【解决方案2】:

是否有某种规范明确记录/要求这样做?

是的,Promises/A+ interoperability spec 需要这个。

但是不,该文档对于本机 Promise 实现并不规范。

对于任何提供本机 Promise 实现的 javascript 运行时,这是否得到保证?

是的。此功能是 ECMAScript 规范中详述的原生 Promise 对象的调度行为的隐式属性。

这是狂野的西部,你不能依赖它吗?

您可以而且应该依赖它。由于 Promises/A+ 规范的流行,即使是大多数非原生的 Promise 实现也能保证这一点。

【讨论】:

    【解决方案3】:

    与任何内置的 ECMAScript 功能一样,本机承诺的行为在 ECMAScript Spec 中定义。

    第 9 版规范中的相关部分是 section 25.6.5.4.1,它定义了 .then 方法的行为,以及 section 8.4.1,它描述了 EnqueueJob 操作(当 .then 在已经- 已解决的承诺)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多