为何setTimeout仅执行一次?附相关代码及输出情况
为什么你的setTimeout只被调用一次?
嘿,我来帮你拆解这个问题~
首先要明确一个核心点:setTimeout本身就是单次触发的API——它只会在你指定的延迟时间到了之后,执行一次回调函数,不会自动重复运行。
看你的代码:
repeatSubscriber = function(observer) { observer.next('first'); (function() { setTimeout(() => { observer.next('repeating timed resp'); }, 3000); }()); };
这里的立即执行函数(IIFE)只是把setTimeout的调用包裹了一层,但本质上你只调用了一次setTimeout,所以3秒后只会触发一次observer.next('repeating timed resp'),自然就只输出一次这个内容啦。
如果想要实现每隔3秒重复触发的效果,有两种常用方案:
方案1:使用setInterval(定时重复触发)
setInterval是专门用来周期性重复执行回调的API,它会每隔指定的时间间隔就执行一次回调:
repeatSubscriber = function(observer) { observer.next('first'); // 每隔3秒执行一次回调 setInterval(() => { observer.next('repeating timed resp'); }, 3000); };
方案2:递归调用setTimeout(可控性更强)
如果你需要更灵活的控制(比如可以在某些条件下停止重复,或者确保每次延迟是在上一次回调执行完成后开始计算),可以在setTimeout的回调里再次调用自身:
repeatSubscriber = function(observer) { observer.next('first'); function repeatTrigger() { setTimeout(() => { observer.next('repeating timed resp'); // 回调执行完后,再次调用自身,实现循环 repeatTrigger(); }, 3000); } // 启动第一次触发 repeatTrigger(); };
内容的提问来源于stack exchange,提问作者el_pup_le
相关产品推荐
相关产品推荐

