setTimeout内TypeScript报Promise返回与void返回预期不匹配错误如何解决
问题原因
你遇到的报错和逻辑问题来自两个核心点:
- setTimeout 回调类型不匹配:你写的
() => attempt()属于箭头函数简写返回,attempt函数本身返回Promise<void>,而setTimeout的回调函数类型定义要求返回void,返回Promise就会触发对应的类型报错。 - 原重试函数存在逻辑缺陷:你创建Promise实例时没有传入
resolve/reject处理函数,就算检测状态的函数执行成功,外层也无法收到状态通知,整个retry返回的Promise会永远处于pending状态。
解决方案
直接按以下逻辑修改重试函数即可,既消除类型报错,也修复原有逻辑缺陷:
const retry = (fn: () => Promise<unknown>, times: number, delay: number): Promise<void> => { let lastError: Error const attempt = (): Promise<void> => { if (times <= 0) { return Promise.reject(lastError) } // 给Promise构造函数补充resolve、reject参数,用于向外层通知状态 return new Promise((resolve, reject) => { fn() .then(() => { // 检测成功,直接resolve通知外层 resolve() }) .catch((err: Error) => { times-- lastError = err // 回调包裹花括号,不返回Promise,直接消除类型报错 setTimeout(() => { // 下一次重试的结果透传给当前Promise的状态处理函数 attempt().then(resolve).catch(reject) }, delay) }) }) } return attempt() }
调用示例
按你的业务需求,实际调用逻辑参考:
const INITIALIZED_KEY = 'your_custom_key' // 最多重试10次,每次间隔1秒 retry(isInitialized, 10, 1000) .then(() => { // 初始化状态校验通过,调用业务函数C functionC() }) .catch((err) => { console.error('重试次数耗尽,初始化失败:', err) })
内容的提问来源于stack exchange,提问作者graceb
相关产品推荐
相关产品推荐

