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

RxJS如何实现函数执行完成后间隔5000ms再次调用

现有实现问题分析

你当前使用的是固定周期触发的timer(0, 5000),它的调度逻辑完全独立于目标函数doit的执行流程,不管doit执行耗时多久、有没有执行完成,每间隔5000ms就会触发一次调用,和你需要的「执行完成后再间隔5000ms调用」的逻辑不符。

正确实现方案

核心逻辑是每次目标函数异步执行完成后,再启动5000ms的延时,延时结束后才触发下一次调用,保证间隔时间是从函数执行结束的节点开始计算。
下面提供两种符合RxJS编程习惯的实现方式:

方式1:使用expand递归操作符(更简洁)

const { defer, delay, expand } = require("rxjs");

// 你的目标异步函数
async function doit() {
    console.log('hey')
    // 此处可替换为实际的业务逻辑,比如接口请求、IO操作等
    await new Promise(resolve => setTimeout(resolve, Math.random() * 3000))
}

defer(() => doit())
  .pipe(
    // 上一次doit执行完成后,延时5000ms再递归执行下一次
    expand(() => defer(() => doit()).pipe(delay(5000)))
  )
  .subscribe()

方式2:沿用BehaviorSubject信号控制思路(更易理解)

const { BehaviorSubject, filter, switchMap, delay, tap } = require("rxjs");

const executeSignal = new BehaviorSubject(true) // 初始信号为true,触发第一次执行

async function doit() {
    console.log('hey')
    await new Promise(resolve => setTimeout(resolve, Math.random() * 3000))
}

executeSignal
  .pipe(
    filter(signal => signal === true), // 仅响应允许执行的信号
    switchMap(() => doit()), // 执行目标函数,等待异步执行完成
    delay(5000), // 执行完成后间隔5000ms
    tap(() => executeSignal.next(true)) // 发送信号触发下一次执行
  )
  .subscribe()

两种方案都可以保证,不管doit本身执行耗时多久,下一次调用永远是在上一次执行完成后的5000ms才触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:15:03