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
相关产品推荐
相关产品推荐

