更新上一个主题值

时间:2016-02-13 23:25:41

标签: rxjs

是否有更简单的方法来获取主题的最新值,执行一些修改并广播更改后的值?

这就是我目前的做法:

private currentMonthStream: Subject<Moment>; 

private goNextMonth() {
    this.currentMonthStream.first().subscribe((currentMonth) => {
        this.currentMonthStream.next(currentMonth.add(1, 'months'));
    });
}

编辑: 我发现这真的只对ReplaySubject和BehaviorSubject有意义,并且选择创建我自己的ReplaySubject实现,可以很容易地做到这一点:

export class StreamSubject<T> extends ReplaySubject<T> {

    constructor() {
        super(1);
    }

    update(fn: (val: T) => T) {
        this.first().subscribe((val) => {
            this.next(fn(val));
        });
    }
}

然而,由于我还是rx的新手,需要这样的函数是否有问题?

1 个答案:

答案 0 :(得分:0)

对于正常主题(即由new Rx.Subject()创建),作为主题也是可观察的,您也可以使用withLatestFrom(不知道它是否已经进入Rxjs v5 beta)获得该主题的最新价值。要发出新值,请使用nextonNext,具体取决于您使用的Rx版本。

  

有更简单的方法吗?

可能还有其他方式,包括使用主题进行信号传递而非持有价值的方式,可以说这是否更简单。

  

我还是rx的新手,需要这样的功能有什么问题吗?

这个问题需要自以为是和主观的答案。也就是说,有一般建议使用主题作为最后的手段(可能是一个难以阅读的):http://davesexton.com/blog/post/To-Use-Subject-Or-Not-To-Use-Subject.aspx

所以我会把你的问题转化为:有没有办法在不使用主题的情况下实现这个功能?有时你可以,有时你不能。