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('失败');
})
//第一步
//第三步
//三秒后 ‘第二步’
//三秒后 ‘成功’