如何终止使用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
相关产品推荐
相关产品推荐

