我试图创建一个rxjs主题,它会在一段时间不活动后重复输出。我最初的设计是使用debounceTime,但是它不会出现不止一次。
我希望主题在调用next
时立即发出,并定期重复该发射,直到提供新值:
Inputs: ---a---------b---------c----
Outputs: ---a---a---a-b---b---b-c---c
目前我有这样的事情:
const subject = new rx.Subject()
subject.debounceTime(5000)
.subscribe(subject)
subject.subscribe(value => console.log(`emitted: ${value}`))
subject.take(1).subscribe(next => next, error => error, () => {
console.log('emitted once')
})
subject.take(2).subscribe(next => next, error => error, () => {
console.log('emitted twice')
})
subject.take(3).subscribe(next => next, error => error, () => {
console.log('emitted thrice')
})
subject.next('a')
然而,这只会发出' a'一次,输出三次发射'从未见过。
有人可以帮我理解这里出了什么问题吗?
答案 0 :(得分:1)
如果我能正确理解您的问题,我认为您可以使用repeatWhen()
运算符:
const subject = new ReplaySubject(1);
subject.next('a');
subject
.take(1)
.repeatWhen(() => Observable.timer(500, 500))
.subscribe(val => console.log(val));
setTimeout(() => subject.next('b'), 1400);
查看现场演示:https://jsbin.com/nufasiq/2/edit?js,console
打印以500ms间隔控制以下输出:
a
a
a
b
b
b
此处需要take(1)
以使链完全正确,repeatWhen()
拦截再次订阅其源Observable。
答案 1 :(得分:1)
另一种选择是使用switchMap
和interval
:
const source = new Rx.Subject();
source
.switchMap((val) => Rx.Observable.interval(5000).map(() => val))
.subscribe(val => console.log(val));
Rx.Observable.interval(11000).subscribe(x => source.next(x));
答案 2 :(得分:0)
您可以尝试类似this jsfiddle的内容(rxjs v4,但我希望用flatMapLatest
替换switchMap
应该为v5做一些技巧):
const input$ = new Rx.Subject()
const repeatedInput$ = input$.flatMapLatest(input => Rx.Observable.interval(200).map(input))
output$ = Rx.Observable.merge(input$, repeatedInput$)
output$.subscribe(console.log.bind(console, `output`))
input$.onNext(2)
setTimeout(() => input$.onNext(4), 300)