Promise拓展方法
Promise拓展
这次介绍一些Promise的拓展方法。
Promise.reject()和Promise.resolve()
Promise.reject() 方法会返回一个一个 “已拒绝”(rejected)的 Promise 对象,参数为 拒绝原因 。
let p = Promise.reject("Mission one fail");
p.catch( err => {
console.log(err);
})
Promise.resolve() 方法返回一个 “解决”(resolve) 的 Promise 对象。
let p = Promise.resolve("Mission success");
p.then( data => {
console.log(data);
})
大白话:
- Promise.resolve()就是直接返回成功
- Promise。reject()就是直接返回失败
接下来我们马上就会用到。。。
Promise.all()
Promise.all()静态方法接受一个 Promise 可迭代对象作为输入,并返回一个 Promise。当所有输入的 Promise 都被兑现时,返回的 Promise 也将被兑现(即使传入的是一个空的可迭代对象),并返回一个包含所有兑现值的数组。如果输入的任何 Promise 被拒绝,则返回的 Promise 将被拒绝,并带有第一个被拒绝的原因。
- 传入一个Promise的可迭代对象(如:数组)
- 如果全部成功,返回一个 成功值 的数组
- 只要有一个失败,就返回一个失败,并返回第一个失败的 原因
let p1 = Promise.reject("Mission 1 failed");
let p2 = Promise.resolve(123);
let p3 = Promise.reject("Mission 3 failed");
let p4 = Promise.resolve("Mission 4 successed!");
//可以分别注释来看看效果
Promise.all([p1, p2, p3, p4]) //有失败的Promise对象
//Promise.all([p2, p4]) //全部成功
.then(res => {
console.log(res);
})
.catch(err => {
console.log(err);
});
Promise.allSettled()
Promise.allSettled() 静态方法将一个 Promise 可迭代对象作为输入,并返回一个单独的 Promise。当所有输入的 Promise 都已敲定时(包括传入空的可迭代对象时),返回的 Promise 将被兑现,并带有描述每个 Promise 结果的对象数组。
- 参数传入一个可迭代对象(如:对象数组)
- 不论成功与否,都不会停,直到所有Promise都结束后,返回一个包含各Promise执行结果的对象数组
let p1 = Promise.reject("mission one fail");
let p2 = Promise.resolve("mission one success");
let p3 = Promise.reject("mission one fail");
let p4 = Promise.resolve("mission one success");
Promise.allSettled([p1,p2,p3,p4])
.then((resList) => {
console.log(resList); //这里返回了一个对象数组,可以打开浏览器F12用控制台看看
resList.forEach(item => { //遍历,根据结果分别进行Promise返回值输出
if(item.status === "fulfilled") console.log(item.value);
else console.log(item.reason);
})
});
Promise.race
Promise.race() 静态方法接受一个 promise 可迭代对象作为输入,并返回一个 Promise。这个返回的 promise 会随着第一个 promise 的敲定而敲定。
- 谁先完成就返回谁的Promise
- 无论是成功的结果还是失败的结果
const p1 = new Promise((resolve,rejected) => {
setTimeout(() => {
resolve("Mission 1 ok");
// rejected("Mission 1 fail");
},1000);
});
const p2 = new Promise((resolve,rejected) => {
setTimeout(() => {
resolve("Mission 2 ok");
// rejected("Mission 2 fail");
},2000);
});
const p3 = new Promise((resolve,rejected) => {
setTimeout(() => {
resolve("Mission 3 ok");
// rejected("Mission 3 fail");
},3000);
});
Promise.race([p1, p2, p3])
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
})
- 通过改变三个
setTimeout()方法的第二个参数来改变执行完成的顺序 - 可以选择分别注释不同的
resolve和rejected来改变何种结果的Promise先完成 - 观察控制台现象
© 版权声明
文章版权归作者所有,未经允许请勿转载。