Promise扫盲贴
then
then函数可以return另一个promise:
constp1=newPromise((resolve,reject)=>{ resolve('p1') }) constp2=newPromise((resolve,reject)=>{ setTimeout(()=>{ resolve('p2') },3000) }) p1.then(res=>{ console.log(res) returnp2 }).then(res=>{ //p2resolve后才执行 console.log(res) }) //p1 //3s后输出... //p2
那么这个p2就会代替当前p1的状态,等到新的p2的状态修改时,下一个then才会执行
catch
1.作用
可以捕获到promise程序执行中的error,等同于 .then(null,rejection) 或 .then(undefined,rejection)
2.可以获取到的错误
promise函数体中抛出的error。在promiseresolve后,再抛出错误,不会被捕获
constp1=newPromise((resolve,reject)=>{thrownewError('error')}) p1.catch(error=>console.log(error))//Error:error
promise的reject操作
constp2=newPromise((resolve,reject)=>reject('rejected')) p2.catch(error=>console.log(error))//rejected
then函数体中抛出的error
constp3=newPromise((resolve,reject)=>resolve('resolved')) p3.then(res=>{ thrownewError('error') }).catch(error=>console.log(error))//Error:error
then函数可以返回一个promise(如果没有定义catch方法),如果这个promise函数体中有reject或者error,也可以捕获到
3.推荐使用catch方式捕获错误,而不是then的第二个参数:
因为catch可以捕获到它前面所有then方法中的错误
finally
- 不管promise最后状态如何,都会执行的操作
- 没有参数,获取不到当前promise最后的状态
Promise.all
1.参数
参数不仅仅可以是数组,具有Iterator接口的对象都可以。
数组参数的每一个元素为promise实例,如果不是,就会调用Promise.resolve转换为Promise实例
constobj={ [Symbol.iterator](){ letindex=0 return{ next(){ return{ //promise对象和其他类型都可以 value:newPromise(resolve=>resolve(index++)),done:index>2 //value:index++,done:index>2 } } } } } constp=Promise.all(obj) p.then(res=>{ console.log(res)//[0,1] })
2.状态
constp=Promise.all([p1,p2,p3]);
p的状态由p1、p2、p3决定,分成两种情况:
- 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
- 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
3.catch
如果参数中的promise定义了catch方法,那么Promise.all()的catch就不会捕获到错误
Promise.race
- 只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的回调函数。
- 参数、catch规则同Promise.all
Promise.resolve
将现有对象转为Promise对象。
1.参数
- 参数为promise实例:原封不动的返回这个实例。
- 参数为thenable对象:将它转为promise对象,然后立即执行它的then方法
- 参数不是thenable对象,或者是一个原始值:返回一个新的promise对象,状态为resolved
- 没有参数:直接返回衣蛾resolved状态的promise对象
Promise.reject
返回一个状态为rejected的promise实例
Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数
constthenable={ then(resolve,reject){ reject('error'); } }; Promise.reject(thenable) .catch(e=>{ console.log(e===thenable) }) //truee并不是'error'
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。