Promise
Promise:ES6新增的内置类(构造函数),用来规划异步编程代码,解决回调地狱问题
let p1 = new Promise([executor])
+ [executor]必须是一个函数,而且new Promise的时候会立即把其执行 “同步”
+ p1是其创建出来的实例
私有属性
+ [[PromiseState]]:"pending"、"fulfilled"、"rejected" 实例的状态
+ [[PromiseResult]]:undefined 实例的值「成功的结果或失败的原因」
公共方法:Promise.prototype
+ then
+ catch
+ finally
+ ...
+ p1.then([onfulfilled],[onrejected])
+ [onfulfilled]/[onrejected]都是函数
+ 实例状态是成功fulfilled的时候,会把[onfulfilled]执行,并且把实例的值作为成功的结果传递给他
+ 实例状态是失败rejected的时候,会把[onrejected]执行,把实例值作为失败原因传递给他
回调地狱
以jQuery的ajax请求为例,在回调函数里面嵌套回调函数称为回调地狱
$.get('./data.json', function cb1(data) {
$.get('./data2.json', function cb2(data2) {
$.get('./data3.json', function cb3(data3) {
$.get('./data4.json', function cb4(data4) {
console.log(data, data2, data3, data4)
})
})
})
})
如何修改实例的状态和值
//基于这种方式创建实例
let p=new Promise((resolve,reject)=>{
...
})
+ 如果executor函数执行报错,则把实例的状态修改为rejected,值是报错原因「不会抛异常」
+ resolve/reject也是函数
resolve('OK') -> 把实例p的状态修改为fulfilled,值(成功结果)是'OK'
reject('NO') -> 把实例p的状态修改为rejected,值(失败原因)是'NO'
+ 一但状态被修改为fulfilled或rejected,后期就不会再更改状态值了
Promise的公共方法
then()
每一次执行THEN方法,都会返回一个“全新的promise实例”
let p2 = p1.then(onfulfilled,onrejected);
不论是onfulfilled还是onrejected执行(由p1状态来决定),方法的执行决定了p2的状态和值
+ 首先看方法执行是否报错,如果报错了,则p2是失败态(rejected),值是报错原因
+ 如果执行不报错,再看方法的返回值
+ 如果返回的是“新的promise实例 -> @NP”,则@NP的状态和值直接决定了p2的状态和值
+ 如果返回的不是新实例,则p2状态是成功(fulfilled),值是函数的返回值
执行Promise.resolve/reject/all/any/race...等静态私有方法,也会创建新的promise实例
+ Promise.resolve(10) 创建一个状态是成功fulfilled,值是10的实例
+ Promise.reject(0) 创建一个状态是失败rejected,值是0的实例
let p1 = new Promise(function (res, rej) {
res(888, 1, 2, 3, 4, 5, 6);//将实例状态变为成功态
// res执行的时候可以让then的第一个回调函数执行
// then的第一个回调函数 只有当实例的状态由pending变成fulfilled的时候才会触发
// res 执行的时候的第一个“参数”会传给th