Promise扫盲贴
前端 / 管理员 发布于 4年前 603
then
then函数可以return另一个promise:
const p1 = new Promise((resolve, reject) =>{ resolve('p1')})const p2 = new Promise((resolve, reject) =>{ setTimeout(() =>{ resolve('p2') },3000)})p1.then(res => { console.log(res) return p2}).then(res =>{ // p2 resolve后才执行 console.log(res)})//p1// 3s后输出...// p2
那么这个p2就会代替当前p1的状态,等到新的p2的状态修改时,下一个then才会执行
catch
1. 作用
可以捕获到promise程序执行中的error,等同于 .then(null, rejection) 或 .then(undefined, rejection)
2. 可以获取到的错误
promise函数体中抛出的error。在promise resolve后,再抛出错误,不会被捕获
const p1 = new Promise((resolve,reject) => {throw new Error('error')})p1.catch(error => console.log(error)) // Error: error
promise的reject操作
const p2 = new Promise((resolve,reject) => reject('rejected'))p2.catch(error => console.log(error)) // rejected
then 函数体中抛出的error
const p3 = new Promise((resolve,reject) => resolve('resolved'))p3.then(res =>{ throw new Error('error')}).catch(error => console.log(error)) // Error: error
then函数可以返回一个promise(如果没有定义catch方法),如果这个promise函数体中有reject或者error,也可以捕获到
3. 推荐使用catch方式捕获错误,而不是then的第二个参数:
因为catch可以捕获到它前面所有then方法中的错误
finally
Promise.all
1. 参数
参数不仅仅可以是数组,具有Iterator接口的对象都可以。
数组参数的每一个元素为promise实例,如果不是,就会调用Promise.resolve转换为Promise实例
const obj = { [Symbol.iterator]() { let index = 0 return { next() { return { // promise对象 和 其他类型都可以 value: new Promise(resolve => resolve(index++)), done: index > 2 // value: index++, done: index > 2 } } } }}const p = Promise.all(obj)p.then(res => { console.log(res) // [0, 1]})
2. 状态
const p = Promise.all([p1, p2, p3]);
p的状态由p1、p2、p3决定,分成两种情况:
3. catch
如果参数中的promise定义了catch方法,那么Promise.all()的catch就不会捕获到错误
Promise.race
Promise.resolve
将现有对象转为Promise对象。
1. 参数
Promise.reject
返回一个状态为rejected的promise实例
Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数
const thenable = { then(resolve, reject) { reject('error'); }};Promise.reject(thenable).catch(e => { console.log(e === thenable)})// true e并不是'error'
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号