20200310

@xiaojingzhao

Plan

  • 你不知道的 js 中卷 promise

Notes

  • 根据 thenable 判断 promise

promise 的信任问题

信任问题有以下几方面:

  1. 回调调用过早
  2. 调用过晚
  3. 调用次数过多过少
  4. 未能传递所需的环境和参数
  5. 吞掉错误和异常

promise 的解决方案

  1. then 中所有的回调都是异步的,防止了 zalgo 的副作用(不会过早调用)
  2. then 中的所有回调会在 promise 状态被改变时立即调用,所以不存在调用过晚的情况
  3. 如果 promise 状态被改变,那么 then 中的回调(onFulfilled 和 onRejected)一定会被调用且调用一次 -- 调用次数过多或过少
  4. 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 保证了回调的执行顺序,并且解决了控制反转带来的问题。