promise方法速记

Promise.all

这个方法将多个promise实例包成一个,方法接受一个从参数数组,数组里都是promise实例(Promise.resolve),参数也可以不是一个数组,但必须是具有 Iterator 接口并且返回promise实例的,返回一个新的promise
1/只有当数组中所有promise实例都变成fulfilled ,后面返回新的promise实例才会变成fulfilled
2/只要数组中有一个promise实例的状态变为reject ,那后面返回的新的promise实例的状态就会为reject

看下面代码

	let p1 = new Promise((resolve,reject) =>{
	        console.log('第一步');
	        resolve(1111);
	})
	let p2 = new Promise((resolve,reject) =>{
	    console.log('第二部');
	    resolve(5555);
	})
	let p3  = new Promise((resolve,reject) =>{
	    console.log('第三步');
	    resolve(666666);
	})  
	Promise.all([p1,p2,p3]).then(res =>{
	    console.log('成功');
	}).catch(err =>{
	    console.log('失败');
	})
	//第一步
   	//第二部
	//第三步
	//成功
	————————————————————————————————
	对比代码
	------------------------------------------------------------------------------------------------
	let p1 = new Promise((resolve,reject) =>{
	        console.log('第一步');
	        resolve(1111);
	})
	let p2 = new Promise((resolve,reject) =>{
	    console.log('第二部');
	    reject(5555);
	})
	let p3  = new Promise((resolve,reject) =>{
	    console.log('第三步');
	    resolve(666666);
	})  
	Promise.all([p1,p2,p3]).then(res =>{
	    console.log('成功');
	}).catch(err =>{
	    console.log('失败');
	})
	//第一步
	//第二部
	//第三步
	//失败

还存在另一个情况
如果p2中它自己存在了catch的错误处理,那这样的话就不会影响到新返回的实例的的状态。
因为p2的实例实际上是执行新返回的这个实例,当catch执行完成以后状态还是会变成resolved,如果p2没有catch那还是执行promise.all的catch的方法

let p1 = new Promise((resolve,reject) =>{
        console.log('第一步');
        resolve(1111);
})
let p2 = new Promise((resolve,reject) =>{
    console.log('第二部');
    reject(5555);
}).then(res =>{
}).catch(err =>{
})
let p3  = new Promise((resolve,reject) =>{
    console.log('第三步');
    resolve(666666);
})  
Promise.all([p1,p2,p3]).then(res =>{
    console.log('成功');
}).catch(err =>{
    console.log('失败');
})
//第一步
//第二部
//第三步
//成功

Promise.race()

这个方法和.all的传参的方式是一样的。
1.首次出现的状态就会成为后面返回实例的状态
看下面的代码

let p1 = new Promise((resolve,reject) =>{
        console.log('第一步');
       reject(1111);
})
let p2 = new Promise((resolve,reject) =>{
    console.log('第二部');
    resolve(5555);
})
let p3  = new Promise((resolve,reject) =>{
    console.log('第三步');
    resolve(666666);
})  
Promise.race([p1,p2,p3]).then(res =>{
    console.log('成功');
}).catch(err =>{
    console.log('失败');
})
//第一步
//第二部
//第三步
//失败

------------------------------------------------------------------
对比代码
------------------------------------------------------------------
let p1 = new Promise((resolve,reject) =>{
    console.log('第一步');
    resolve(1111);
})
let p2 = new Promise((resolve,reject) =>{
    console.log('第二部');
    reject(5555);
})
let p3  = new Promise((resolve,reject) =>{
    console.log('第三步');
    resolve(666666);
})  
Promise.race([p1,p2,p3]).then(res =>{
    console.log('成功');
}).catch(err =>{
    console.log('失败');
})
//第一步
//第二部
//第三步
//成功

第一段代码,号理解,出现了错误所以走到了catch方法里面。
第二段代码,p2出现了错误状态但是返回的promise实例的状态还是为成功的状态,这就是这个方法的特点。

Promise.allsettled()

有时候我们需要等一组异步操作结束以后在接着执行回调,这样的话promise.all就不能实现我们想要的
这个方法,参数和promise.all是一样的,需要注意是这个方法会等数组中全部的状态发生变化,返回的 Promise 对象才会发生状态变更。(fulfilled或rejected)
看下面代码

let p1 = new Promise((resolve,reject) =>{
    setTimeout(() =>{
        console.log('第一步');
        reject(1111);
    },1000)
})
let p2 = new Promise((resolve,reject) =>{
    setTimeout(() =>{
        console.log('第二步');
        reject(1111);
    },5000)
})

Promise.allSettled([p1,p2]).then(res =>{
    console.log('成功');
}).catch(err =>{
    console.log('失败');
})

//一秒后打印   ‘第一步’
//5秒后 打印  '第三步'
//5秒后打印'成功'

不会像all这样的方法只有有状态返回就会直接返回

promise.any

这个方法如果有一个有一个状态成功,那返回promise的状态就是成功,如果成功状态是异步的,那就会等待异步执行完成一会才会返回promise的状态。如果有直接成功的状态,那返回promsie的状态就会立即执行.then方法
看下面的代码

	let p1 = new Promise((resolve,reject) =>{
    // setTimeout(() =>{
        console.log('第一步');
        resolve(1111);
    // },1000)
})
let p2 = new Promise((resolve,reject) =>{
    setTimeout(() =>{
        console.log('第二步');
        reject(1111);
    },3000)
})
let p3 = new Promise((resolve,reject) =>{
    // setTimeout(() =>{
        console.log('第三步');
        reject(1111);
    // },3000)
})
Promise.any([p1,p2,p3]).then(res =>{
    console.log('成功');
}).catch(err =>{
    console.log('失败');
})
//第一步
//第三步
//成功    执行了 .then
//3秒后  ‘第二步’-

-------------------------------代码分割--------------------------------------------
let p1 = new Promise((resolve,reject) =>{
    // setTimeout(() =>{
        console.log('第一步');
        reject(1111);
    // },1000)
})
let p2 = new Promise((resolve,reject) =>{
    setTimeout(() =>{
        console.log('第二步');
        resolve(1111);
    },3000)
})
let p3 = new Promise((resolve,reject) =>{
    // setTimeout(() =>{
        console.log('第三步');
        reject(1111);
    // },3000)
})
Promise.any([p1,p2,p3]).then(res =>{
    console.log('成功');
}).catch(err =>{
    console.log('失败');
})
//第一步
//第三步
//三秒后  ‘第二步’
//三秒后  ‘成功’

参考:https://es6.ruanyifeng.com/#docs/promise

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值