《JavaScript Promise 迷你书》 笔记
什么是 Promise
1、Promise 最初提出是在 E 语言中,它是基于并列/并行处理设计的一种编程语言。
Node.js 等规定 JavaScript 的回调函数的第一个参数为 Error 对象,这是它的一个惯例。
而 Promise 则是把类似的异步处理对象和处理规则进行规范化,并采用统一的接口编写,而采用规定方法之外的写法都会报错。
2、Promise 的三种状态:Pending、Fulfilled、Rejected
实战 Promise
1、Promise.resolve(value)和 promise.reject(error),new Promise()方法的快捷方式
2、使用 Promise 可以避免同时使用同步、异步调用可能引起的混乱问题
3、Promise chain,关注 Promise 的执行顺序。
Promise#then 不仅注册一个回调函数,它还会将回调函数的返回值进行变换,创建并返回一个 Promise 对象。
4、Promise.all 接收一个 Promise 对象的数组作为参数,当数组里的所有 Promise 对象全部变为 resolve 或 reject 时,才会去调用.then 方法
5、Promise.race 只要有一个 promise 对象进入 resolve 或 reject 状态,就会进行后面的处理。
6、使用.then 还是使用.catch:
.then 方法中的 onRejected 参数所指定的回调函数,实际上针对的是其 promise 对象或者之前的 promise 对象,而不是针对.then 方法里面指定的第一个参数,即 onFulfilled 所指向的对象,因此使用.catch 效果更好。
advanced
1、Promise 的实现类库
如果说一个类库兼容 Promises/A+ 的话,那么就是说它除了具有标准的 then 方法之外,很多情况下也说明此类库还支持 Promise.all 和 catch 等功能。
如果我们说一个类库具有 then 兼容性的话,实际上指的是 Thenable ,它通过使用 Promise.resolve 基于 ES6 Promise 的规定,进行 promise 对象的变换。
2、Promise.resolve 的最大特征之一就是可以将 thenable 的对象转换为 promise 对象。
Thenable 风格表现为位于回调和 Promise 风格中间的一种状态,作为类库的公开 API 有点不太成熟,所以并不常见。
Thenable 本身并不依赖于 Promise 功能,但是 Promise 之外也没有使用 Thenable 的方式,所以可以认为 Thenable 间接依赖于 Promise。
3、使用 reject 而不是 throw
在 Promise 中使用 throw 语句的话,很难区分 throw 是我们主动抛出来的,还是因为真正的其它 异常 导致的。
在 then 中使用 reject 的方法,返回的是 promise 对象,那么根据这个 promise 对象的状态,在下一个 then 中注册的回调函数中的 onFulfilled 和 onRejected 的哪一个会被调用也是能确定的。
4、使用 Promise.race 和 delay 取消 XHR 请求
经过一定时间后变为解决状态的 delayPromise
基于 delayPromise 和 Promise.race 的超时实现方式
取消 XHR promise 请求(abort)
通过模块化实现 promise 对象和操作的分离
5、什么是 Promise.prototype.done
ES6 Promises 和 Promises/A+等在设计上并没有对 Promise.prototype.done 做出任何规定,但是很多实现类库都提供了该方法的实现。
done 并不返回 promise 对象,也就是说,在 done 之后不能使用 catch 等方法组成方法链。
done 中发生的异常会被直接抛给外面,也就是说,不会进行 Promise 的错误处理(Error Handling)。
由于 done 不会返回 promise 对象,所以我们不难理解它只能出现在一个方法链的最后。
此外,我们已经介绍过了 Promise 具有强大的错误处理机制,而 done 则会在函数中跳过错误处理,直接抛出异常。
Promises API Reference
1、Promise#then
promise 对象会在变为 resolve 或者 reject 的时候分别调用相应注册的回调函数。
当处理 onFulfilled 和 onRejected 的函数(handler)返回一个正常值的时候,这个值会传递给 promise 对象的 onFulfilled 方法。
当处理 onFulfilled 和 onRejected 的函数(handler)中产生异常的时候,这个值则会传递给 promise 对象的 onRejected 方法。
2、Promise#catch
一个等价于 promise.then(undefined, onRejected) 的语法糖。
3、Promise.resolve
根据接收到的参数不同,返回不同的 promise 对象。
虽然每种情况都会返回 promise 对象,但是大体来说主要分为下面 3 类:
接收到 promise 对象参数的时候,返回的还是接收到的 promise 对象
接收到 thenable 类型的对象的时候,返回一个新的 promise 对象,这个对象具有一个 then 方法
接收的参数为其他类型的时候(包括 JavaScript 对或 null 等),返回一个将该对象作为值的新 promise 对象
4、Promise.reject
返回一个使用接收到的值进行了 reject 的新的 promise 对象。
而传给 Promise.reject 的值也应该是一个 Error 类型的对象。
5、Promise.all
生成并返回一个新的 promise 对象。
参数传递 promise 数组中所有的 promise 对象都变为 resolve 的时候,该方法才会返回, 新创建的 promise 则会使用这些 promise 的值。
如果参数中的任何一个 promise 为 reject 的话,则整个 Promise.all 调用会立即终止,并返回一个 reject 的新的 promise 对象。
由于参数数组中的每个元素都是由 Promise.resolve 包装(wrap)的,所以 Paomise.all 可以处理不同类型的 promose 对象。
6、Promise.race
生成并返回一个新的 promise 对象。
参数 promise 数组中的任何一个 promise 对象如果变为 resolve 或者 reject 的话, 该函数就会返回,并使用这个 promise 对象的值进行 resolve 或者 reject。