【问题标题】:takeLast seems to kill observable streamtakeLast 似乎杀死了可观察的流
【发布时间】:2017-06-25 14:53:22
【问题描述】:

我正在尝试设置一个可观察的流,在其中将最近的设置值与上一个设置值进行比较,并且我想根据两者之间的一些变化进行过滤。我在服务中设置了一个 BehaviorSubject(Angular 2,如果这很重要)并创建了返回它的函数:

getFilters() {
    return this.filtersSubject.asObservable();
}

然后在使用它的组件中,我正在尝试这个:

this.eventFilterService.getFilters()
    .takeLast(2)
    .subscribe((data) => console.log(data));

但我没有得到控制台日志。如果我删除 takeLast,我会看到我的数据返回。从文档中,我的假设是,它只会触发两次。我的目标是将takeLast 输入到reduce 然后是一个过滤器。

我使用 takeLast 是不是错了?

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    takeLast(x) 将等待 Observable 完成,然后才能发出最后的 x 发射。由于您使用主题,因此您需要调用 complete() 才能使其工作。

    但您确实想计算两个发射之间的差异。为此,请使用 .buffer() 运算符

    Rx.Observable.from([2,3,5,8])
         .bufferCount(2,1)
         .map(buff =>  buff[1] - buff[0])
         .subscribe(delta => console.log(delta))
    

    【讨论】:

    • buffer 接受一个 observable。我想你会想使用bufferCount(2, 1)
    • 你是对的;通勤时不应该在我的手机上写 SO 答案 ;-)
    • 谢谢,我会研究这两个函数。我假设 take 也等待缓冲区完成?这就是我讨厌 Rx 文档的原因……这些例子很烂:/我现在意识到文档完成的含义。
    • bufferCount 有第二个参数'skip',它表示在下一个缓冲区之前要前进多少个元素。所以bufferCount(2,1) 将创建[1,2],[2,3],[3,4] 而bufferCount(2,3) 将创建[1,2],[4,5],...
    • 看起来就像你说的那样工作,但我得到了非常奇怪的结果,我不明白发生了什么。我想我必须提出另一个 SO 问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2015-07-26
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多