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

如何终止使用setTimeout的递归异步函数?

问题

我写了一段递归执行的异步代码,想让它在收到特定事件前重复运行,但这种递归写法找不到终止的办法,完全没法实现停止的需求,也没查到相关的终止方法说明。代码如下:

function sleep (ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function foo (x) {
  await sleep(3000)
  await asyncTask()
  await foo()
}

之前考虑过用setInterval配合异步函数,但setInterval只适合同步回调,而且我不想为这点需求加额外的npm依赖。


可行解决方案

后来摸索出一个可行的写法,用setTimeout替代递归,通过保存定时器ID来实现终止逻辑:

let timeoutId

async function loop (socket) {
  await asyncTask()

  timeoutId = setTimeout(
    async () => await loop(socket),
    3000
  )
}

socket.on('event', () => clearTimeout(timeoutId))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:18:12