0

我试图找出一个好方法来表示 ReplaySubject 当前是“空的”。

import {ReplaySubject} from 'rxjs/ReplaySubject';
const rs = new ReplaySubject<Object>();

 // ...
constructor(){
  this.sub =  rs.subscribe(...);
}

每次调用构造函数时,它都会重播主题中的所有项目。但是我的问题是 - 是否有一些我们可以听的事件,它告诉我们什么时候主题变空?

我唯一能想到的是在主题完成后触发自定义/不同事件,如下所示:

rs.next({done:true});

将数据传递给 next() 方法是表明 ReplaySubject (暂时)为空/没有事件的最佳方式吗?

4

2 回答 2

3

因为 Subject 也是一个观察者,你可以complete()在最终调用之后next()调用。然后你可以用方法的第三个参数来监听它subscribe(...)

const rs = new ReplaySubject<Object>();
rs.next({a: 1})
rs.complete()

rs.subscribe(
    obj => console.log(obj),
    error => {},
    () => console.log('completed')
);
// Outputs
// {a: 1} completed
于 2018-02-22T16:09:35.193 回答
1

现在好了,我想你可以设置一个辅助 observable 来告诉你最后重播的项目是什么:

const last$ = rs.replay(1);

然后你只需 combineLatest 并扫描......一旦你到达 last$ 发出的项目,那么你的 ReplaySubject 已经完成重播:

this.sub = Observable.combineLatest(
  rs,
  last$.take(1)
).scan((acc: { item: Object, isReplay: boolean }, curr: [Object, Object]) => {
    return {item: curr[0], isReplay: acc.isReplay && curr[0] !== curr[1]};
  }, {isReplay: true}
).subscribe(...);
于 2018-02-15T04:41:04.280 回答