为何我实现的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)); }) };
这里有两个致命问题:
- 缺少
return关键字:你创建了新的Promise,但没有把它返回出去,所以调用promiseRace()会得到undefined,根本不是一个Promise实例。 - 同样存在未处理非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
相关产品推荐
相关产品推荐

