将多个Promise实例包装成一个新的Promise实例的方法

本文介绍了Promise的all、allSettled、race和any方法,详细阐述了它们的工作原理及在不同情况下的行为表现,包括错误处理和异常情况。通过示例代码展示了各种情况下Promise实例的执行结果,帮助理解这些方法在处理并发任务时的差异。
摘要由CSDN通过智能技术生成

将多个Promise实例包装成一个新的Promise实例的方法


Promise对象提供了很多方法来实现对多个Promise实例的统一处理,常用的方法我会在下面一一说明。

Promise.all()

Promise.all() 当所有的 Promise 都执行完成后返回所有数据组成的数组,如果任一 Promise 失败,则直接返回该 Promise 的错误信息。

// Promise 传参封装
function test(arg) {
   
  const p = new Promise((resolve, reject) => {
   
    if (arg) {
   
      resolve(`result is ${
     arg}`);
    } else if (arg === 0) {
   
      throw new Error("result is 0");
    } else {
   
      reject("result is null");
    }
  });
  return p;
}

// 都成功
Promise.all([test(1), test(2), test(4)])
  .then((data) => console.log(data))
  .catch((err) => console.error(err));

// test() reject
Promise.all([test(1), test(), test(0)])
  .then((data) => console.log(data))
  .catch((err) => console.error(err));

// test(0) 抛出异常
Promise.all([test(1), test(0), test()])
  .then((data) => console.log(data))
  .catch((err) => console.error(err));

输出结果为:

[ 'result is 1', 'result is 2', 'result is 4' ]
result is null
Error: result is 0

上面测试的 Promise 实例如果自己回调了又会如何呢?

// Promise 传参封装
function test(arg) {
   
  const p = new Promise((resolve, reject) => {
   
    if (arg) {
   
      resolve(`result is ${
     arg}`);
    } else if (arg === 0) {
   
      throw new Error("result is 0");
    } else {
   
      reject("result is null");
    }
  })
    .then((result) => {
   
      console.log(`Promise success: ${
     result}`);
      return result;
    })
    .catch((err) => {
   
      console.error(`Promise error: ${
     err}`);
      return err;
    });
  return p;
}
Promise.all([test(1), test(), test(0)])
  .then((data) => console.log(`all success: ${
     data}`))
  .catch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值