闲来无事,研究一下
总结一篇,分享大家
如有错误,欢迎指正
发现问题,麻烦轻喷
promise 是为了解决异步请求, 返回结果无限callback的问题.
使用promise 可以让代码看起来更简洁,清晰
// Promise.all([p1,p2,p3]) 将三个promise请求 打包,返回一个整体的数组
// 示例:
let p11 = Promise.resolve('aaaa');
// let p22 = Promise.resolve('bbbb');
let p22 = Promise.reject('bbbb');
let p33 = Promise.resolve('cccc')
let all = Promise.all([p11, p22, p33]).then(res => {
console.log(res, 'all=======') // ["aaaa", "bbbb","cccc"]
// promise.all() 必须保证p11, p22, p33 都是resolve 状态的情况下,才能执行成功
// 使用数组的解构赋值
let [res1, res2, res3] = res
console.log(res1, res2, res3) // aaaa, bbbb, cccc
}).catch(err => {
console.log(err, 'all---------err-----')
})
//如果promise.all 碰到了一个reject, 就会拒绝执行, 抛出错误.
// promise.all 必须确保所有的状态都是resolve 状态,都是成功状态, 如果有一个reject, promise.all(),就会执行catch
// promise.race race 是赛跑,谁返回的快, 就返回谁, 只会返回一个.不管对错, 对的执行then, 错误执行catch
// promise.allSettled 遇到reject,也会执行then完毕,返回json 数组,返回状态和value
// 示例: allSettled
let allSettled = Promise.allSettled([p11, p22, p33]).then(res => {
console.log(res, 'allSettled=======')
}).catch(err => {
console.log(err, 'allSettled-------err------')
})
allSettled 遇到reject 返回结果
let p44 = new Promise(function (resolve) {
setTimeout(() => {
resolve('p44-resolve')
}, 500)
})
let p55 = new Promise(resolve => {
setTimeout(() => {
resolve('p55-resolve')
}, 400)
})
let p66 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('p66-reject')
}, 100)
})
let race = Promise.race([p44, p55, p66]).then(res => {
console.log(res, 'race=======')
}).catch(err => {
console.log(err, 'race-------err------')
})
p66-reject race=======
// 结果
这个就证明了 race 是通过返回时间来拦截结果的, 执行快的先返回,并且只返回一次,正确的走then, 错误的走catch
总结
- all. 要求三个promisee 都是resolve 状态.并且会返回一个数组. 如果其中一个promise 是reject 状态, 就会执行catch.
- race, 会执行反应最迅速的一个promise. 不管结果是then 还是catch
- allSettled. 会返回所有promise的状态.
以上