Promise / A + spec第2.2.4条的目的是什么?

时间:2016-04-29 07:30:17

标签: javascript promise es6-promise event-loop

承诺/ a +规范第2.2.4条规定:

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

然后在笔记中说明:

  

这里的“平台代码”意味着引擎,环境和承诺   实施代码。在实践中,这个要求确保了这一点   在事件发生后,onFulfilled和onRejected异步执行   然后调用循环转换,并使用新堆栈。

这是否意图确保当链中存在大量onFulfilled函数时,它们的执行不会导致线程阻塞?

或者在我不读的行之间还有其他什么东西吗?

1 个答案:

答案 0 :(得分:8)

原因是,当回调是始终异步而不是可能异步时,它会提供更加一致和可靠的api。请考虑以下代码

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

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

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