20200311
Plan
- 你不知道的 js -- promise
Notes
promise 是可信任的嘛?
p1 = new Promise(resolve => resolve(42));
p2 = new Promise(resolve => resolve(p1));
p1 === p2; // false
p3 = Promise.resolve("42");
p4 = Promise.resolve(p3);
p3 === p4; // true
Promise resolution 会展开非 promise 的 thenable 的值。防止把这个不规范的非 promise 的 thenable 对象当做 promise 来处理,所以需要展开。第二个原因,当我们使用第三方工具的时候,如果不确定返回的是否是 promise,可以使用 promise.resolve 来规范返回结果。
建立信任
- promise 通过规范,解决了第三方信任问题 -- 控制反转
- promise 解决了人对于执行顺序的理解和代码实际发生顺序的差异的问题
- promise 解决了回调地狱的问题
- promise 规范了输出,所有输出皆异步,无论 thenable, promise 还是普通的值都会被处理成规范的结果,返回的结果是可以信任的
错误
promise 的最佳实践?在最后加上 catch 可以避免吞掉错误。
- 如何捕获 catch 中的错误?
- 全局处理 promise 的 reject,如果一定时间内没有 error 函数注册,那么就能知道这个错误没有被捕获
- 浏览器可以在垃圾回收的时机,知道 promise 是否有未捕获的错误