Promise
Promise 作为 ES6 的特性,可以很好地创建异步工作流
- Promise 是构造函数
- Promise 只有三种状态(pending,resolve,reject),pending 是刚创建 Promise 实例的状态,然后一旦转为 resolve 或者 reject,就不可变更
创建 Promise
以封装 xhr 为例子
1 | function getURL(url) { |
- reject 必须是接受一个错误对象实例,比如
new Error('12')
里面是什么类型的都可以
使用 Promise
使用上面封装 xhr 的 getURL 的函数,该函数返回一个 Promise 实例
- Promise 的实例方法有两个:then 和 catch,这个两个方法都返回新的 Promise 对象
- then 有两个参数。then(onfilled,onrejected),第一个是参数值 resolve 来填充,第二个是 reject 来填充
- catch 实则是 then(undefined,onrejected)的别名,但是一般情况下都是用这个
- then 的第二个参数 检测不了自身 Promise 对象 onfilled 出了异常,而 catch 是基于对上次的 then 产生的 promise 对象,看这里
1 | let url1 = "http://azu.github.io/promises-book/json/comment.json", |
Promise chain 获取上次 promise 的返回值
由于 Promise 链式调用的时候,每个 Promise 都是独立的。但是可以通过 return 值来传给下一个 Promise,因为 return 了值是填充了当前 Promise 对象的 resolve
1 | promise |
Promise 静态方法
- Promise.resolve(42) === new Promise((resolve,reject)=>resolve(42)) ,是它的语法糖
- Promise.reject(new Error(42)) === new Promise((resolve,reject)=>reject(new Error(42))) 是它的语法糖
- 如果有多个 Promise 同时需要判断才能进行下一步,可以用 Promise.all([promise1,promise2])。这个 then 方法返回的参数也是一个数组,跟 promise1 和 promise2 的顺序一样。需要注意的是,all 是并行执行的。
- Promise.race([promise1,promise2]) 则和数组的 some 方法很像,只要有一个 promise 对象进入 FulFilled 或者 Rejected 状态的话,就会继续进行后面的处理。
1 | promise.all([getURL(url1), getURL(url2)]).then(function(result) { |