Promise
为什么会有 promise
首先让我们来了解下,回调函数有什么缺点:
- 多重嵌套,导致回调地狱
- 代码跳跃,并非人类习惯的思维模式 ,代码逻辑不连续
- 信任问题,你不能把你的回调完全寄托与第三方库,因为你不知道第三方库到底会怎么执行回调(多次执行)
- 第三方库可能没有提供错误处理
- 不清楚回调是否都是异步调用的(可以同步调用 ajax,在收到响应前会阻塞整个线程,会陷入假死状态,非常不推荐)
为了兼容一些 promise 库,Promise 采用了一种鸭子模型(如果它看起来像只鸭子,叫起来像只鸭子,那它一定就是只鸭子)来判断这个函数是不是一个 promise 函数,也就是判断.then()方法是否注册了 “fullfillment” 和 / 或 “rejection” 事件.
代码跳跃则是通过事件穿透解决的,但是也没有那么黑魔法,只不过是 then 默认参数就是把值往后传或者抛
onResolved = typeof onResolved === 'function' ? onResolved : function(value) {return value}
onRejected = typeof onRejected === 'function' ? onRejected : function(reason) {throw reason}promise 方法
手写 promise
Promise 技巧
出错时
出错时,是用 throw new Error()还是用 return Promise.reject(new Error())呢?
性能方面,throw new Error()会使代码进入 catch 块里的逻辑
而使用 Promise.reject(new Error()),则需要构造一个新的 Promise 对象(里面包含 2 个数组,4 个函数:resolve/reject,onResolved/onRejected),也会花费一定的时间和内存
综上,我觉得在 Promise 里发现显式的错误后,用 throw 抛出错误会比较好,而不是显式的构造一个被 reject 的 Promise 对象。
取消Promise
译:如何在 JavaScript 中取消 Promise – 云谦的博客