如何使rxjs主题定期重复其最后一次发射?

时间:2017-04-18 02:44:18

标签: javascript rxjs

我试图创建一个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'一次,输出三次发射'从未见过。

有人可以帮我理解这里出了什么问题吗?

3 个答案:

答案 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)

另一种选择是使用switchMapinterval

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));

查看demo in jsbin

答案 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)