什么是promise呢?
- 在ES6之前我们自己来设计回调函数
-
function execCode(counter, succeed, lose) { setTimeout(() => { if (counter > 0) { //counter判断是否成功 let total = 0; for (let i = 0; i < counter; i++) { total += 1; } //成功时回调的函数 succeed(total); } else { lose(`${total}值有问题`); //失败时回调函数 } }, 3000); } execCode( 100, (value) => { console.log(`${value}成功了`); }, (err) => { console.log(err); } );
- 第一,我们需要自己来设计回调函数,回调函数的名称、回调函数的使用;
- 第二,对于不同的人,不同的框架设计出来的方案是不同的,那么我们必须耐心去看别人的源码或者文档,才知道这个函数怎么使用。
-
- promise是一个类,可以翻译成 承诺、许诺、期约;
- 我们使用的时候给予调用者一个promise,后面回调函数时,就可以创建一个promise对象
- 在我们通过new创建promise对象时,我们需要传入一个回调函数,我们称之为execuror
- 这个回调函数会被立即执行,并且给这个函数传入另外两个回调函数resolve、reject;
- 当调用resolve回调函数时,会执行promise对象的then方法传入的回调函数
- 当调用reject回调函数时,会执行promise对象的catch方法传入的回调函数
Promise代码结构
- Promise代码结构
-
1 const promise = new Promise((resolve, reject) => { 2 resolve("哈哈哈哈"); //成功时调用 3 reject("失败了"); //失败时调用 4 }); 5 promise 6 .then((res) => { 7 //调用resolve执行then方法的回调函数 8 console.log(res); 9 }) 10 .catch((err) => { 11 //调用reject执行catch方法的回调函数 12 console.log(err); 13 });
-
- 上面Promise使用过程,可以分为3个状态
- 待定(pending):初始状态,既没有被兑现,也没有被拒绝;当执行executor中的代码时,处于该状态
- 已兑现(fulfilled):意味着操作成功完成;执行了resolve时,处于该操作,promise已经被兑现;
- 已拒绝(rejected):意味着操作失败;执行了reject时,处于该状态,promise已经被拒绝
- 注意:promise的状态一旦被确定下来,就不会再更改,也不能在执行某一个回调函数来改变状态。
executor
- executor是在创建promise时需要传入的一个回调函数,这个回调函数会被立即执行,并且有两个参数,
- 通常我们会在Executor中确定我们的promise状态
- 通过resolve,可以兑现promise的状态,我们也可以称之为已决议(resolved);
- 通过reject,可以拒绝(reject)Promise的状态;
resolve的特殊值
- 如果resolve传入一个普通值或者对象,那么这个值会作为then回调的参数。
- 如果resolve的值的是本身promise对象,那么当前的promise的状态会由传入的promise来决定
- 如果resolve中传入的是一个对象,并且这个对象有then方法,那么会执行该then方法,并且根据then方法的结果来决定promise的状态
then方法参数
- then方法中可以写入两个回调函数,第一个是兑现状态,第二个是结束状态。
- then方法本身是有返回值的,它的返回值是一个promise所以可以进行链式调用
- then的回调函数中如果有返回值则等于resolve(返回值);没有返回值则后面的then接收到是undefind
catch方法
- catch方法也是promise对象上的一个方法(实例方法);他也是放在promise原型上的
- 一个promise的catch方法是可以被多次调用的
- catch方法也是会返回一个promise对象的,所以catch方法后面我们可以继续调用then方法或者catch方法;
- 让catch的promise返回值是reject()则需要调用thow new Error('错误叙述')抛出异常;
finally方法
- finally是在ES9中新增的一个特性:表示无论Promise对象无论变成fulfilled还是reject状态,最终都会被执行的代码
- finally方法是不接收参数的,因为无论前面是fulfilled状态,还是rejected状态,它都会执行。
resolve,reject类方法
- 前面学习的then、catch、finally方法都属于Promise的实例方法,都是存放在Promise的Prototype上的
- Pomise.resolve等于new promise,并执行resolve函数
- Pomise.reject等于new promise,并执行reject函数
all类方法
- promise.all的作用是将多个promise包裹在一起形成一个新的promise;
- all方法其中一个promise变成reject状态时,新的promise就会立即变成对应的reject状态。
- 新的promise状态由包裹的所有promise共同决定:
- 当所有的promise状态变成fulfil led状态时,新的Promise状态为fulfilled,并且会将所有的Promise的返回值组成一个数组;
- 当有一个Promise状态为reject时,新的promise状态为reject,并且会将第一个reject的返回值作为参数;
allSettled类方法
- 该方法会在所有的promise都有结果(settled),无论是fulfilled,才会有最终的状态;
- 并且这个Promise的结果一定是fulfilled的;
reca类方法
- rece是竞赛的意思,表示多个Promise相互竞争,谁先有结果,那么就能使用谁的结果。
any类方法
- any和rece方法类似
- any方法会等到一个fulfilled,才会更新promise的状态;
- 如果所有的promise都是reject的,那么也会等到所有的promise都变成rejected状态
- 如果所有的Promise都是reject的,那么自己会报以一个AggregateError的错误。