Promise/A+ 规范第 2.2.4 条背后的意图是啥?

Posted

技术标签:

【中文标题】Promise/A+ 规范第 2.2.4 条背后的意图是啥?【英文标题】:What is the intention behind clause 2.2.4 of Promise/A+ spec?Promise/A+ 规范第 2.2.4 条背后的意图是什么? 【发布时间】:2016-08-24 06:07:32 【问题描述】:

promise/a+ 规范的第 2.2.4 条说:

onFulfilled 或 onRejected 在执行之前不能被调用 上下文堆栈仅包含平台代码。

然后在注释中指出:

这里的“平台代码”是指引擎、环境和承诺 实现代码。在实践中,这一要求确保 onFulfilled 和 onRejected 在事件之后异步执行 循环调用 then ,并使用新堆栈。

这样做的目的是为了保证当一个链中有大量的onFulfilled函数时,它们的执行不会导致线程阻塞?

或者还有什么我没有读到的字句之间的内容?

【问题讨论】:

另请参阅here、here 和those threads 中的较小程度的threads 【参考方案1】:

原因是当回调是总是异步而不是可能异步时,它提供了更一致和可靠的 api 来使用。考虑以下代码

var pizza;
browse***().then(function()
    eatPizza(pizza);
);
pizza = yesterdaysLeftovers;

现在 sn-p 清楚地假设 onFulfilled 不会立即被调用,如果不是这样,我们很快就会有未使用的比萨饼,我们会感到饥饿。虽然在这种情况下,bug 很容易修复,但执行顺序更容易遵循,因此当您可以做出一些这样的假设时,api 更容易使用。

有一个封闭的issue on the Promises/A+ GitHub repo 讨论了这个问题。

【讨论】:

以上是关于Promise/A+ 规范第 2.2.4 条背后的意图是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Promise的源码实现(完美符合Promise/A+规范)

Promise A+ 规范

手把手带你实现符合Promise/A+规范的Promise

手把手带你实现符合Promise/A+规范的Promise

手写基于Promise A+规范的Promise

深入理解Promise并写一个符合Promise a+规范的Promise代码