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

What is the intention behind clause 2.2.4 of Promise/A+ spec?

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

onFulfilled or onRejected must not be called until the execution context stack contains only platform code.

然后在注释中指出:

Here “platform code” means engine, environment, and promise implementation code. In practice, this requirement ensures that onFulfilled and onRejected execute asynchronously, after the event loop turn in which then is called, and with a fresh stack.

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

或者是否还有其他我没有阅读的内容?

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

var pizza;
browseWhosebug().then(function(){
    eatPizza(pizza);
});
pizza = yesterdaysLeftovers;

现在该片段清楚地假设 onFulfilled 不会立即被调用,如果不是这种情况,我们很快就会有未使用的披萨,我们会饿着肚子。虽然在这种情况下,错误很容易修复,但执行顺序更容易遵循,因此当您可以做出这样的假设时,api 更容易使用。

有一个已关闭的 issue on the Promises/A+ GitHub 回购协议对此进行了讨论。