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

setTimeout内TypeScript报Promise返回与void返回预期不匹配错误如何解决

问题原因

你遇到的报错和逻辑问题来自两个核心点:

  1. setTimeout 回调类型不匹配:你写的() => attempt()属于箭头函数简写返回,attempt函数本身返回Promise<void>,而setTimeout的回调函数类型定义要求返回void,返回Promise就会触发对应的类型报错。
  2. 原重试函数存在逻辑缺陷:你创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 20:57:01