返回

Promise(四):Promise.race详解,胜负已定,由快定调

前端

前言

在大白话讲解 Promise 系列文章的上一篇中,我们深入探讨了 Promise.all 的用法和实现原理。它就像一场竞赛,所有选手都要完成任务,而最终的结果以最慢的那个为准。然而,在现实世界中,我们常常需要一种不同的竞赛规则——谁跑得最快,谁就决定比赛结果。这就是 Promise.race 的用武之地。

Promise.race

Promise.race 函数接受一个 Promise 数组作为参数,并返回一个新的 Promise。这个新 Promise 的行为非常简单:它会立即解决或拒绝,取决于数组中哪一个 Promise 最先解决或拒绝。其他 Promise 的状态将被忽略。

用法

Promise.race 的用法非常简单:

const promises = [
  Promise.resolve('A'),
  Promise.reject('B'),
  Promise.resolve('C'),
];

Promise.race(promises).then((result) => {
  // result 为第一个解决的 Promise 的结果,即 'A'
}).catch((error) => {
  // error 为第一个拒绝的 Promise 的原因,即 'B'
});

原理

Promise.race 的实现原理并不复杂。它会创建一个新的 Promise,然后为每个输入 Promise 添加一个监听器。一旦任何一个输入 Promise 解决或拒绝,新 Promise 就会立即解决或拒绝,并采用第一个 Promise 的结果或原因作为自己的结果或原因。

与 Promise.all 的区别

Promise.race 与 Promise.all 的主要区别在于,Promise.race 关心的是谁先完成,而 Promise.all 关心的是所有人都完成。具体来说,它们有以下不同:

  • 执行时机: Promise.race 一旦检测到任何一个 Promise 解决或拒绝,就会立即执行回调。而 Promise.all 必须等到所有 Promise 都解决或拒绝才会执行回调。
  • 结果: Promise.race 返回第一个解决或拒绝的 Promise 的结果或原因。而 Promise.all 返回一个包含所有 Promise 结果的数组。

应用场景

Promise.race 的应用场景非常广泛,比如:

  • 超时处理: 当并发执行多个请求时,我们可以使用 Promise.race 来设置一个超时时间。如果任何一个请求在指定时间内返回,则立即执行回调;否则,以超时错误拒绝。
  • 资源竞争: 当多个任务争夺同一资源时,我们可以使用 Promise.race 来获取第一个可用的资源。
  • 并行执行: 当有多个相互独立的任务需要并行执行时,我们可以使用 Promise.race 来简化代码,并只关注最快完成的任务。

总结

Promise.race 是一个非常有用的工具,它允许我们创建新的 Promise,并根据谁先完成来决定其结果或原因。它的用法简单易懂,并且在各种场景中都有着广泛的应用。通过熟练掌握 Promise.race,我们可以编写出更加高效、灵活的异步代码。

**