微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JS高级—0xxx—Promise


 

一、为什么需要promise

首先,前端的网络请求需要用这种方式

 

 

大家自己写或者调用别人的,需要重写或看源码等导致开发成本过大,ECMA做了统一,于是就有了promise;

 

出现了promise,只要给调用者返回promise即可,调用者根据promise的状态自己做处理即可;

调用者说:我先给你一个承诺即promise,你先去处理其他mainScript,一会就会请求成功后我会调用resolve(data),然后根据规范promise.then()也会被联动调用,这个时候你便可以再promise.then()里接收到数据;

 

做了统一,方便开发;

 

 

 

二、执行器

1.执行器executor

就是new Promise里的回调函数

 

 2.resolve传不同值的区别

 

 

三、Promise对象(实例)方法

(一)then()方法     课程19集18’’

注意,调用resolve()后会执行then方法的第一个回调函数,这是规定,这些都是ecma的规定,不要问为什么,规定就是这样,v8引擎也就是这样实现的。

 

1.同一个pormise可以添加多个then方法,然后resolve()时,这多个then方法会同时被调用

2.then方法也会返回一个promise,所以可以链式调用

(1)如果返回一个普通的值(数字/字符串/普通对象/undefined):那么会被包裹到一个新的promise里继续返回,并且这个值作为这个新promise里resolve()方法的参数;

promise.then( (res)=>{ 
   return 'aaaa';
})

等价于:

promise.then( (res)=>{ 
   return new Promise((resolve,reject)=>{
     resolve('aaa');
   }
})

 

(2)如果返回一个promise,那么这个promise也会被包裹,并且返回的promise的状态,会决定then()方法返回promise的状态;

不明白的话,可以看看上一章中resolve传不同值的状态;

promise.then( (res)=>{ 
   return new Promise((resolve,reject)=>{
     resolve(1111);
   }
})

等价于:

promise.then( (res)=>{ 
   return new Promise((resolve,reject)=>{
     resolve( new Promise((resolve,reject)=>{
             resolve(1111);
     });
   }
})

 

(3)如果返回一个对象,并且这个对象实现了then方法接口

promise.then( (res)=>{ 
   return {
     then: ()=> resolve(11111)
   }
})

等价于:

promise.then( (res)=>{ 
   return new Promise((resolve,reject)=>{
     resolve( obj.then());
   }
})

 

3.then()方法可以传递两个参数,第一个参数时resolve()执行的,第二个参数时reject()执行的;

但是现在一般都是只写一个参数,第二个参数不写,rejected要执行的回调放在catch方法中;

(二)catch方法

 

 

(三)finally方法

 

 

 

四、Promise类方法

(一)resolve方法

 

 

 (二)reject方法

 

 (三)all方法

感觉很像数组的every方法,都要满足时才为true;

res是一个数组,数组里是所有的promise的返回值,数组元素的顺序就是all()方法里参数的顺序;

 

(四)allSettled方法 

 

(五)race方法

 

 (六)any方法

all方法类似every,那么any方法就类似some方法,只要有一个就为true;

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐