如何用repeat的delay选项替代已弃用的repeatWhen操作符?
RxJS中用repeat替代repeatWhen的正确方式
在测试、重构客户项目以适配RxJS未来版本时,遇到弃用提示:repeatWhen操作符将在v9或v10版本移除,需改用repeat的delay选项。原使用repeatWhen的代码如下:
import { of, fromEvent, repeatWhen } from 'rxjs'; const source = of('Repeat message'); const documentClick$ = fromEvent(document, 'click'); const result = source.pipe(repeatWhen(() => documentClick$)); result.subscribe(data => console.log(data))
想改写为使用repeat的形式,但不清楚如何将documentClick$事件流作为delay参数传入(原delay选项似乎仅接受数字),以下是正确的转换方式:
RxJS的repeat操作符的delay参数支持接收一个返回Observable的函数,通过这个函数可以精准控制重复触发的时机,完美替代repeatWhen的逻辑。
改写后的代码:
import { of, fromEvent, repeat } from 'rxjs'; const source = of('Repeat message'); const documentClick$ = fromEvent(document, 'click'); const result = source.pipe( repeat({ delay: () => documentClick$ }) ); result.subscribe(data => console.log(data))
核心说明:
repeat配置对象中的delay属性并非只能传数字,传入函数时,该函数会在源Observable每次完成后被调用,其返回的Observable发出第一个值时,就会触发源Observable的重复订阅。- 上述写法与原
repeatWhen实现的逻辑完全一致:源发出值完成后,等待documentClick$的点击事件触发重复。
这种写法符合RxJS新版本规范,代码简洁优雅,可直接用于交付客户的项目。
内容的提问来源于stack exchange,提问作者Anders Bernard
相关产品推荐
相关产品推荐

