承诺/ a +规范第2.2.4条规定:
在执行之前,不得调用onPulfilled或onRejected 上下文堆栈仅包含平台代码。
然后在笔记中说明:
这里的“平台代码”意味着引擎,环境和承诺 实施代码。在实践中,这个要求确保了这一点 在事件发生后,onFulfilled和onRejected异步执行 然后调用循环转换,并使用新堆栈。
这是否意图确保当链中存在大量onFulfilled函数时,它们的执行不会导致线程阻塞?
或者在我不读的行之间还有其他什么东西吗?
答案 0 :(得分:8)
原因是,当回调是始终异步而不是可能异步时,它会提供更加一致和可靠的api。请考虑以下代码
var pizza;
browseStackOverflow().then(function(){
eatPizza(pizza);
});
pizza = yesterdaysLeftovers;
现在该片段清楚地假设onFulfilled
不会立即被调用,如果不是这样,我们很快就会有未使用的披萨,我们就会感到饥饿。虽然在这种情况下错误很容易修复,但执行的顺序更容易遵循,因此当你做出这样的假设时,api更容易使用。
有一个已关闭的issue on the Promises/A+ GitHub回购,并对此进行了讨论。