20200310
Plan
- 你不知道的 js 中卷 promise
Notes
- 根据 thenable 判断 promise
promise 的信任问题
信任问题有以下几方面:
- 回调调用过早
- 调用过晚
- 调用次数过多过少
- 未能传递所需的环境和参数
- 吞掉错误和异常
promise 的解决方案
- then 中所有的回调都是异步的,防止了 zalgo 的副作用(不会过早调用)
- then 中的所有回调会在 promise 状态被改变时立即调用,所以不存在调用过晚的情况
- 如果 promise 状态被改变,那么 then 中的回调(onFulfilled 和 onRejected)一定会被调用且调用一次 -- 调用次数过多或过少
- promise 的规范定义了 promise 如何抛出错误
promise 执行顺序的细微差别
p3 = new Promise(resolve => resolve("B"));
p1 = new Promise(resolve => resolve(p3));
p2 = new Promise(resolve => resolve("A"));
p1.then(v => console.log(v));
p2.then(v => console.log(v));
// 输出 A B
p3 = Promise.resolve("B");
p1 = Promise.resolve(p3);
p2 = Promise.resolve("A");
p1.then(v => console.log(v));
p2.then(v => console.log(v));
// 输出 B A
为什么两个例子,输出结果不同?
More
之前一直以为 promise 只有解决一个 callback hell 的问题。实际上 promise 保证了回调的执行顺序,并且解决了控制反转带来的问题。