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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:00:16