Promise
Promise是一种用于处理异步操作的对象。它代表了一个尚未完成但预计会在未来完成的操作,并提供了一种结构化的方式来处理操作的结果。
promise
创建
可以通过 new Promise(res,rej)来创建一个Promise对象。res和rej是两个可调用的函数,用于处理异步操作的结果
状态
Promise有三种不同的状态:pending(进行中),fulfilled(已成功)和rejected(已失败)。
初始状态为pending ,当异步操作完成后, Promise可以转为fulfilled或rejected状态。
处理结果
.then()方法来处理Promise的成功结果(fulfilled)。
.catch()方法处理Promise的失败状态(rejected)。
.finally()方法可以在Promise无论成功或失败后,都执行的操作。
案例:
const myPromise = new Promise((res,rej)=>{
setTimeout(()=>{
const num = Math.random();
console.log(num)
if(num>0.5){
res(num)
}else{
rej('Error')
}
},1000)
})
myPromise.then(res=>{
console.log('成功',res)
}).catch(rej=>{
console.log('失败',rej)
}).finally(()=>{
console.log('成功失败都会执行')
})
myPromise
.then((res) => {
console.log('成功', res);
return res+1
})
.then((res) => {
console.log('成功1', res);
})
.then((res) => {
console.log('成功2', res); // undefined
})
.catch((rej) => {
console.log('失败', rej);
})
.finally(() => {
console.log('成功失败都会执行');
});
如果想要使用.then传递参数,直接 return 返回参数就可以,如果没有return则为 undefined
Promise.all
接收一个Promise数组作为参数,并返回一个新的Promise。这个新的Promise在所有传入的Promise都解决(fulfilled)时解决,并提供一个包含所有Promise结果的数组。如果传入的任意一个Promise被拒绝(rejected),新的Promise将立即被拒绝,并返回第一个被拒绝的Promise的原因。
案例
const promise1 = new Promise((resolve) => {
setTimeout(() => {
resolve('Promise 1');
}, 2000);
});
const promise2 = new Promise((resolve) => {
setTimeout(() => {
resolve('Promise 2');
}, 1500);
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('Promise 3 has been rejected');
}, 1000);
});
Promise.all([promise1, promise2])
.then((results) => {
console.log('所有Promise都已解决:', results);
})
.catch((error) => {
console.log('至少一个Promise被拒绝:', error);
});
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log('所有Promise都已解决:', results);
})
.catch((error) => {
console.log('至少一个Promise被拒绝:', error);
});
实际场景
通过调用后台接口,获取一个对象数组,再做判断,如果判断成立则循环调接口,获取接口返回参数,赋值,返回对象数组
Promise.race()
接收一个Promise数组作为参数,并返回一个新的Promise。这个新的Promise将会在参数中的任意一个Promise解决或拒绝时,解决或拒绝,并提供第一个解决或拒绝的Promise的结果或原因。与Promise.all()不同,Promise.race()只要有一个Promise解决或拒绝,就会立即返回结果。
案例
const promise1 = new Promise((resolve) => {
setTimeout(() => {
resolve('Promise 1');
}, 2000);
});
const promise2 = new Promise((resolve) => {
setTimeout(() => {
resolve('Promise 2');
}, 1500);
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('Promise 3 has been rejected');
}, 1000);
});
Promise.race([promise1, promise2, promise3])
.then((result) => {
console.log('第一个解决的Promise:', result);
})
.catch((error) => {
console.log('第一个拒绝的Promise:', error);
});