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
相关产品推荐
相关产品推荐

