@1 对promise的基本认识:
? ? ? ? promise的作用:主要用于解决回调地狱。
? ? ? ? promise首先是一个构造函数,通过new的方式来构建属于自己的实例对象。
? ? ? ? promise参数需要传递一个函数,并且函数体的参数也需要传递两个方,看下面的代码实现
? ? ? ? const p = new promise((resolve,reject)=>{console.log('111')})? p返回值就是一个promise实例
????????对象, 在promise这个构造函数本身存在两个私有变量,我们通过console.log(new
????????promise(()=>{}))打印就可以得到关于promise构造函数的两个私有变量[[PromiseState]]状态,
? ? ? ? 状态分为三种情况:pending 等待 fulfiled? 成功? rejected 失败
????????[[PromiseResult]]结果,如果参数没有对promise的结果没有做任何的处理,返回值undefiend
? ? ? ? 同时可以返回成功的结果和失败的原因以及失败的值
@2 关于promise构造函数原型上面的方法
? ? ? ? promise.prototype上面存在三个方法catch then? finally,分别代表失败结果执行的方法,成功
????????执行的方法,无论失败或者成功都会执行的方法。
? ? ? ? 最后通过.then .catch .finally 来接受promise返回的结果,其中这三个方法接受的参数同样也
????????是一个方法, 方法的参数就是返回的结果。
@3? 改变Promise返回的结果,需要用到构造函数参数中函数的参数resolve与reject,代码执行;
? ? ? ? const a?= new Promise((resolve,reject)=>{ resolve(10) }) // 返回成功的结果 通过.then来接收
? ? ? ? 上面代码操作过程把构造函数私有属性的状态值pending 转化为了 fulfilled
? ? ? ? const b?= new Promise((resolve,reject)=>{ reject(10) }) // 返回失败的结果 通过.catch来接收
????????上面代码操作过程把构造函数私有属性的状态值pending 转化为了 frejected?
? ? ? ? 需要注意的是 状态值一经改变之后,就没有重新再进行改变了
? ? ? ? a.then(res=>{console.log(res)}) // 接收成功的结果 10
? ? ? ? b.catch(res=>{console.log(res)}) // 接受失败的结果 10
? ? ? ? 除此之外在then这个方法中,还存在第二个参数也是接受一个函数,该函数接受失败的结果
? ? ? ? a.then(res=>{console.log(res)},err=>{console.log(err)}) // err返回的是a实例对象失败的结果
@4 返回promise实例的方法,除了new Promise之外还有别的什么办法。
? ? ? ? 第一种: 通过Promise.reject() Promise.resolve()?
? ? ? ? 第二种: 通过then函数执行后的返回值也是属于promise的实例
? ? ? ? 例如:const a = Promise.reject(10) a.then(res=>{console.log(res)}) // 10?
? ? ? ? ? ? ? ? ? ?const b =? a.then(res=>{ return? res*10 })? b.then(res=>{console.log(res)}) // 100
????????如果在then函数中没有手动去修改promise的状态,除非返回值有错误,否则都是在返回的
????????promise实例都在在一个then中进行接收?
?
@5 then链的穿透和顺延的机制:
? ? ? ? then中()两个方法都可以不传,如果不传的话会顺延到下一个then中的方法中,会在相同的状
????????态中执行。
? ? ? ? Promise.resolve(100).then(null,(err)=>{console.log(err)}) .then(res=>{console.log(res)})100
? ? ? ? catch方法一般放在最后面执行,前面的没有承载错误,最后会穿透到catch中
? ? ? ? promise.reject(10).then(res=>{console.log(res)}).catch(err=>{console.log(err)}) // 10
@6 关于promise.all? ?promise.any? promise.race这三个方法
? ? ? ? 这个三个方法接收的都是关于promise的一个数组,如果数组中的某一项不是promise,就会
????????把其变为promise,
? ? ? ? all这个方法,如果promise返回值都是成功的就会接收一个成功的数组,值按照顺序输出,如
????????果其中有一项是错误的结果就是失败的,失败的后面也不做处理。
? ? ? ? any只要有一个成功的值就是成功的结果,如果都失败最后才返回失败。
? ? ? ? race属于赛跑机制,第一个执行的结果就是返回的结果了。如果第一个是成功的就是成功,
????????第一个是失败的就是失败。
@7? ?关于await async ;
? ? ? ? async 后面执行的函数 返回值是一个promise的实例;async function xxx(){ }
? ? ? ? await 主要用来监听promise实例的状态,当返回成功的结果会进行接收,并且执行await下面
????????的代码,如果接收的是失败的结果 后面的代码不再执行 控制台并且会报错。
? ? ? ? 我们可以使用try{}catch(){ } 进行捕获成功失败的结果
????????
????????
?
??
????????
????????