前端的Promise的方法all,race,any

🔥 深入解析Promise并发控制:allanyrace三大方法实战手册


Promise的核心作用

JavaScript作为单线程语言,为避免同步代码阻塞影响用户体验,采用异步机制处理非即时任务。主线程执行同步代码时,异步任务(如Promise)会被推入消息队列 。其中,Promise.then()产生的微任务(Microtask)​ ​ 具有最高优先级,优先于宏任务(如setTimeout)执行,从而高效管理异步流程。


​**Promise.all():全成功才成功**​

特点​:

  • 接收Promise数组,返回新Promise
  • 全成功:返回结果数组(按输入顺序)
  • 一票否决:任一失败则立即拒绝,返回首个错误

适用场景 ​:

多个强依赖的并行任务需全部成功(如同时请求多个API)。

代码实现​:

js 复制代码
Promise.myAll = function(promises) {
  let results = []; // 存储结果(保证顺序)
  let completed = 0; // 完成计数器
  return new Promise((resolve, reject) => {
    promises.forEach((promise, index) => {
      Promise.resolve(promise) // 处理非Promise值
        .then(value => {
          results[index] = value; // 按索引存入结果
          completed++;
          if (completed === promises.length) {
            resolve(results); // 全部成功时返回结果数组
          }
        })
        .catch(reject); // 任一失败立即拒绝
    });
  });
};

​**Promise.any():一成功就成功**​

特点​:

  • 接收Promise数组,返回新Promise
  • 一票通过:任一成功则立即返回该结果
  • 全败才拒 :全部失败时拒绝,返回AggregateError(含所有错误)

适用场景 ​:

容错场景(如从多个备用源获取最快可用数据)。

代码实现​:

javascript 复制代码
javascript
javascript
复制
Promise.myAny = function(promises) {
  let errors = []; // 存储所有错误
  let failed = 0; // 失败计数器
  return new Promise((resolve, reject) => {
    promises.forEach((promise, index) => {
      Promise.resolve(promise)
        .then(resolve) // 任一成功立即解决
        .catch(err => {
          errors[index] = err; // 按索引记录错误
          failed++;
          if (failed === promises.length) {
            // 全部失败时返回聚合错误
            reject(new AggregateError(errors, "All promises were rejected"));
          }
        });
    });
  });
};

​**Promise.race():先到先得**​

特点​:

  • 接收Promise数组,返回新Promise
  • 速度竞赛:采用首个敲定状态(无论成功/失败)的结果

适用场景 ​:

超时控制(如网络请求限时响应)。

代码实现​:

javascript 复制代码
Promise.myRace = function(promises) {
  return new Promise((resolve, reject) => {
    for (const promise of promises) { // 遍历可迭代对象
      Promise.resolve(promise) // 处理非Promise值
        .then(resolve) // 首个成功则解决
        .catch(reject); // 首个失败则拒绝
    }
  });
};

三大方法对比总结

方法 解决条件 拒绝条件 适用场景
Promise.all 所有Promise成功 任一Promise失败 强依赖的并行任务(如多API)
Promise.any 任一Promise成功 所有Promise失败 容错处理(如多数据源择优)
Promise.race 首个Promise状态敲定 首个Promise状态敲定 竞速场景(如超时控制)

关键提示​:

  1. Promise.all 的"快速失败"特性可能导致部分异步操作未终止
  2. Promise.any 的聚合错误(AggregateError)需特殊处理
  3. 空数组输入:all 立即解决,race 永久挂起,any 拒绝
相关推荐
子兮曰5 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
kyriewen6 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
问心无愧05136 小时前
ctf show web 入门42
android·前端·android studio
kyriewen6 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u6 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby7 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情6737 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇7 小时前
前端转后端:SQL 是什么
前端
张元清8 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试
广州华水科技8 小时前
单北斗GNSS变形监测是什么?主要有怎样的应用与优势?
前端