当前位置: 首页 > article >正文

Promise.race

Promise.race 是 JavaScript 中 Promise 对象的一个静态方法,用于将多个 Promise 实例包装成一个新的 Promise 实例。这个新的 Promise 实例会在 最先完成(无论是 fulfilled 还是 rejected) 的 Promise 完成时完成,并返回该 Promise 的结果或错误。

1. 语法

Promise.race(iterable);
  • 参数iterable 是一个可迭代对象(如数组),包含多个 Promise 实例。

  • 返回值:返回一个新的 Promise 实例,其状态和结果由最先完成的 Promise 决定。

2. 使用场景

Promise.race 通常用于以下场景:

  1. 超时控制:设置一个超时 Promise,如果某个操作在指定时间内未完成,则触发超时。

  2. 竞速任务:从多个异步任务中选择最先完成的任务。

  3. 资源竞争:在多个资源中选择最先可用的资源。

3. 示例

(1) 基本用法

const promise1 = new Promise((resolve) => setTimeout(resolve, 500, 'one'));
const promise2 = new Promise((resolve) => setTimeout(resolve, 100, 'two'));

Promise.race([promise1, promise2])
  .then((result) => {
    console.log(result); // 输出: 'two'(因为 promise2 先完成)
  })
  .catch((error) => {
    console.error(error);
  });

(2) 超时控制

function fetchWithTimeout(url, timeout) {
  const fetchPromise = fetch(url);
  const timeoutPromise = new Promise((_, reject) =>
    setTimeout(() => reject(new Error('Request timed out')), timeout)
  );

  return Promise.race([fetchPromise, timeoutPromise]);
}

fetchWithTimeout('https://example.com', 5000)
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error(error));

(3) 竞速任务

const task1 = new Promise((resolve) => setTimeout(resolve, 300, 'Task 1'));
const task2 = new Promise((resolve) => setTimeout(resolve, 100, 'Task 2'));
const task3 = new Promise((resolve) => setTimeout(resolve, 200, 'Task 3'));

Promise.race([task1, task2, task3])
  .then((result) => {
    console.log(result); // 输出: 'Task 2'(因为 task2 最先完成)
  })
  .catch((error) => {
    console.error(error);
  });

4. 注意事项

非 Promise 值

如果 iterable 中包含非 Promise 值(如数字、字符串等),Promise.race 会将其视为已完成的 Promise。

Promise.race([1, 2, 3]).then((result) => {
  console.log(result); // 输出: 1(第一个非 Promise 值)
});

空数组

如果 iterable 是一个空数组,返回的 Promise 将永远处于 pending 状态。

Promise.race([]).then((result) => {
  console.log(result); // 永远不会执行
});

错误处理

如果最先完成的 Promise 是 rejected 状态,Promise.race 返回的 Promise 也会是 rejected 状态。

const promise1 = new Promise((resolve) => setTimeout(resolve, 500, 'one'));
const promise2 = new Promise((_, reject) => setTimeout(reject, 100, 'error'));

Promise.race([promise1, promise2])
  .then((result) => {
    console.log(result); // 不会执行
  })
  .catch((error) => {
    console.error(error); // 输出: 'error'
  });

5. 总结

  • Promise.race 用于从多个 Promise 中选择最先完成的一个。

  • 适用场景:超时控制、竞速任务、资源竞争等。

  • 注意事项

    • 支持非 Promise 值。

    • 空数组会导致返回的 Promise 永远处于 pending 状态。

    • 错误处理需要特别注意。

通过合理使用 Promise.race,可以更好地控制异步任务的执行顺序和超时处理。


http://www.kler.cn/a/524242.html

相关文章:

  • shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。
  • 【Valgrind】安装报错: 报错有未满足的依赖关系: libc6,libc6-dbg
  • 【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)
  • pytorch线性回归模型预测房价例子
  • 免杀国内主流杀软的恶意样本分析
  • 【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(一)
  • 在win11下搭建ios开发环境
  • javaweb复习总结
  • 算法随笔_27:最大宽度坡
  • AI学习(vscode+cline+deepseek)
  • 【MQ】如何保证消息队列的高性能?
  • DeepSeek LLM解读
  • cursor ide配置远程ssh qt c++开发环境过程记录
  • [内网安全] 内网渗透 - 学习手册
  • Android OpenGL(七)实现滤镜效果(特效渲染)
  • 让Android adb支持互联网调试脱离局域网
  • window中80端口被占用问题
  • Json格式的字符串转换为Json格式
  • 街景全景图切分六面视图(含数据处理教程,可批量处理)
  • unordered_map和unordered_set的使用
  • 读量子霸权17模拟宇宙(下)
  • IPhone14 Pro MAX 设备详情
  • 【论文推荐|深度学习,滑坡检测,多光谱影像,自然灾害,遥感】2022年Landslide4Sense竞赛成果:基于多源卫星影像的先进滑坡检测算法研究(四)
  • git gui 笔记
  • Deepseek的api调用报错乱码问题
  • KNN算法学习实践