Kris Kowal'的设计承诺文章

Kris Kowal's design promises article

本文关键字:承诺 文章 Kowal Kris      更新时间:2023-09-26

我正在阅读Kris Kowal关于承诺的设计文章
我有一个关于blah函数的问题
为什么这个函数在某些情况下会抛出异常
如何重现这种特殊情况?

安全和不变量

 var blah = function () {
     var result = foob().then(function () {
         return barf();
     });
     var barf = function () {
         return 10;
     };
     return result; };

此函数将抛出异常或返回一个promise将很快用值10来实现。这取决于foob()在事件循环的同一个循环中解析(发出立即在同一堆栈上回调)或在将来的回合中。如果回调被推迟到未来的转折点,它将永远成功。

这只是JavaScript,因为barf是在注册了then回调之后定义的-如果同步调用了then回调-它将不会被定义,它将与执行相同

(undefined)();

这是一个错误。插图:

// this code works
setTimeout(function(){
    foo("HI");
});
var foo = alert;
// this code throws
(function(){
    foo("Hi");
})();
var foo = alert;

Promise库确保在引擎执行平台代码时始终调用回调-因此,对于Promise,如果它们符合Promise/a(+),则这不是问题。例如,jQuery的promise在这里会失败,这取决于foob是否在jQuery 1和2中解析,而不是在jQuery 3中解析(他们修复了它)。