You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我实现的Promise.race无法正常运行?

问题根源与修复方案

嘿,我来帮你拆解这两段代码里的问题,以及怎么写出符合预期的promiseRace实现~

先看第一个代码的错误

你的第一段代码:

function promiseRace(...promises) { 
  return new Promise((resolve, reject) => { 
    for(const promise of promises) promise.then(resolve, reject); 
  }) 
};

抛出TypeError: promise is not a function的核心原因是:你没有处理非Promise类型的参数。

Promise.race的规范允许传入任意类型的参数(比如普通字符串、数字,甚至null/undefined),这些值会被自动当作「已resolved的Promise」。但你的代码直接对每个参数调用.then(),如果参数是普通值(比如5或者'hello'),它们并没有.then方法,就会触发类型错误(不同环境下错误提示可能略有差异,但本质都是非Promise值无法调用.then)。

再看第二个代码的错误

你的第二段代码:

const promiseRace = (...promises) { 
  new Promise((res, rej) => { 
    promises.forEach(p => p.then(res).catch(rej)); 
  }) 
};

这里有两个致命问题:

  1. 缺少return关键字:你创建了新的Promise,但没有把它返回出去,所以调用promiseRace()会得到undefined,根本不是一个Promise实例。
  2. 同样存在未处理非Promise参数的问题,和第一个代码的错误一致。

正确的实现方式

我们只需要给每个参数套一层Promise.resolve(),把它统一转化为Promise实例,同时确保返回新创建的Promise即可:

function promiseRace(...promises) {
  return new Promise((resolve, reject) => {
    // 遍历所有传入的参数
    for (const item of promises) {
      // 用Promise.resolve()把任意值转化为Promise实例
      Promise.resolve(item).then(resolve, reject);
    }
  });
}

为什么这样能解决问题?

  • Promise.resolve(item)会自动处理所有情况:如果item本身是Promise实例,直接返回它;如果是thenable对象(有.then方法的对象),会等待它决议;如果是普通值,会返回一个已resolved的Promise,值就是这个普通值。
  • 一旦有任意一个Promise完成(resolve或reject),就会立即调用外层Promise的resolve或reject,完全符合Promise.race「率先完成即返回结果」的特性。

测试验证

你可以用以下例子测试这个实现:

// 测试普通值和Promise混合
promiseRace(1, Promise.resolve(2)).then(console.log); // 输出1

// 测试reject的情况
promiseRace(Promise.reject('error'), Promise.resolve(3)).catch(console.log); // 输出'error'

内容的提问来源于stack exchange,提问作者user10792998

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:16:08