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

IT技术 javascript promise es6-promise event-loop
2021-02-14 03:05:11

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

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

然后在注释中指出:

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

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

或者在我没有阅读的字里行间还有什么其他的东西吗?

1个回答

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

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

现在该代码段明确假设onFulfilled不会立即调用 ,如果不是这种情况,我们很快就会有未使用的比萨饼躺在周围,我们会饿着肚子。虽然在这种情况下,bug 很容易修复,但执行顺序更容易遵循,因此当您可以做出这样的一些假设时,api 更容易使用。

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