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

Promise.race未触发拒绝Promise,函数超时逻辑失效问题

问题分析与解决方案

你的代码存在两个关键问题,导致超时逻辑未按预期生效:

1. 语法错误:数组元素分隔符使用错误

Promise.race 的参数是Promise数组,数组元素必须用逗号分隔,但你在 getValues(); 后误用了分号。这会导致JavaScript引擎解析异常,实际 getValues() 并未被纳入竞争的Promise列表,而是被单独执行,后续 await 的仅为超时Promise。引擎的容错处理最终让 getValues() 的结果覆盖了初始的values值。

修正后的代码需将分号改为逗号:

async function getDBValues(): Promise<string> {
  let values = 'value b';

  try {
    values = await Promise.race([
      getValues(), // 替换分号为逗号
      new Promise((resolve, reject) => {
        setTimeout(() => reject(`rejected`), 1);
      })
    ]);
  } catch (error) {
    console.log(`Error ${error}`);
  }

  return values;
}

2. 确保getValues是真正的异步Promise

如果getValues是同步返回结果(未正确封装为异步操作),它会比1ms的超时Promise更早完成,自然会返回'value a'。你需要确认getValues确实返回一个需等待30ms的Promise,示例如下:

function getValues(): Promise<string> {
  return new Promise(resolve => {
    setTimeout(() => resolve('value a'), 30);
  });
}

验证逻辑

修正语法错误且getValues为30ms后resolve的Promise时,1ms的超时Promise会先触发reject,进入catch块后values不会被覆盖,最终返回'value b',符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:33:22