zhangsanshi / issue-blog

It's a blog rather than issue
0 stars 0 forks source link

官方 Promise 和 jQuery Deferred 实现的不同点(jquery版本小于3) #29

Open zhangsanshi opened 7 years ago

zhangsanshi commented 7 years ago

举个栗子 https://zhangsanshi.github.io/demo/promise.html 目前猜测是 Promise/A 和 Promise/A+ 规范的不同造成的, 稍后再去研究。

zhangsanshi commented 7 years ago

then 方法必须返回一个 promise 对象 注3

promise2 = promise1.then(onFulfilled, onRejected);
如果 onFulfilled 或者 onRejected 返回一个值 x ,则运行下面的 Promise 解决过程:[[Resolve]](promise2, x) 如果 onFulfilled 或者 onRejected 抛出一个异常 e ,则 promise2 必须拒绝执行,并返回拒因 e 如果 onFulfilled 不是函数且 promise1 成功执行, promise2 必须成功执行并返回相同的值 如果 onRejected 不是函数且 promise1 拒绝执行, promise2 必须拒绝执行并返回相同的据因

下面回答是错误的

Promise/A 未定义 then 的细节,在 Promise/A+ 中定义了,参见 https://promisesaplus.com/#point-59,造成了实现方式的不同。 If both resolvePromise and rejectPromise are called, or multiple calls to the same argument are made, the first call takes precedence, and any further calls are ignored.的意思是比如我在 resolve 里面造成了错误,按照规范错误就是 reject,于是就造成了 resolve 和 reject 都有调用了,这时候最接近错误的then会执行,其他的都会忽略,但不是不执行,会交给发生错误之前的 promise 执行

zhangsanshi commented 7 years ago

更改标题的原因是,看了jQuery3 的 更新博客发现实现的规范是 Promise/A+