SOURCE

//使用 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 命令行工具 X clear

                    
>
console