//使用 Promise.all 来并发两个接口,如果其中任意一个异常,则两个区域都无法正常渲染。
//Promise.allSettled 则可以避免这个问题 可用于并行执行独立的异步操作,并收集这些操作的结果。
/*输出
> 看看是否执行2
> 错误消息1
*/
Promise.all([
Promise.reject('错误消息1'),
Promise.resolve('a2')
]).then((ret) => {
// 不会执行
console.log('看看是否执行1')
console.log(ret)
}).catch((error) => {
// 因为有一个promise返回为reject。所以程序只会走到这里
// 输出:a1
console.log('看看是否执行2')
console.log(error)
})
/* reject 和resolve 均被执行返回 输出
> [{"status":"rejected","reason":"a11"},{"status":"fulfilled","value":"a12"}]
*/
// 使用es11的Promise.allSettled
Promise.allSettled([
Promise.reject('a11'),
Promise.resolve('a12')
]).then((ret) => {
console.log(ret)
// 这样可以过滤掉rejected,避免整段程序运行错乱
handleFun(ret.filter(el => el.status !== 'rejected'))
})
//当Promise列表中的任意一个promise成功resolve则返回第一个resolve的结果状态 如果所有的promise均reject,则抛出异常表示所有请求失败
Promise.any([
new Promise((resolve, reject) => setTimeout(reject, 500, '哎呀,我被拒绝了')),
new Promise((resolve, reject) => setTimeout(resolve, 1000, '哎呀,她接受我了')),
new Promise((resolve, reject) => setTimeout(resolve, 2000, '哎呀,她也接受我了')),
])
.then(value => console.log(`输出结果: ${value}`))
.catch (err => console.log(err))
//Promise.race()方法接收一个数组形式的promise,并且返回一个promise对象,一旦数组中有一个promise被resolve或者reject就会立刻返回。
// 输出:
// 第一个promise被resolve
// 成功: 10
// 第二个promise被resolve
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第一个promise被resolve');
resolve(10);
}, 1 * 1000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第二个promise被resolve');
resolve(20);
}, 2 * 1000);
});
Promise.race([p1, p2])
.then(value => console.log(`成功: ${value}`))
.catch(error => console.log(`失败: ${error}`));
console