每次我们订阅可观察的角度数据时,如何获取旧数据?

时间:2018-12-10 13:33:59

标签: angular

最近我达到了这个要求,我在3个不同的for循环中订阅了3次可观察的次数。

我每次都获取更新的数据。 每次我们订阅可观察的角度数据时,如何获取旧数据?

3 个答案:

答案 0 :(得分:0)

您可以为此使用服务属性或组件属性。 如果您想将数据保留在组件本地,请使用一个属性,并在 next 回调中继续将接收到的数据推送到该属性中。另一方面,如果您想与其他组件进行共享数据/逻辑,则可以采用与推送数据相同的方法来使用服务,而只是将服务注入到要使用它的其他组件中。(不要忘记使用同一服务实例)
Services

答案 1 :(得分:0)

您将需要自己跟踪旧值,因为Angular没有提供获取这些旧值的方法。这是一些示例代码,显示了执行此操作的一种方法。

@Component(...)
export class SomeComponent {
    constructor(private dataService){   }

    private oldData;

    ngOnInit(){
       this.dataService.getSomeData().subscribe((data)=>{
          if(this.oldData){
             //do stuff with old data. 
             //Not available until the SECOND time this callback is called
          }
          this.oldData = data;

          //do stuff with new data
       });
    }
}

答案 2 :(得分:0)

您可以使用ReplaySubject来“重放”或向新订阅者发出旧值:

Subject的一种变体,可以“重播”或将旧值发出给新 订阅者。它缓冲一定数量的值并将发出这些值 除了发射新的订户外,还立即向任何新订户定价 现有订户的价值。

import * as Rx from "rxjs";

const subject = new Rx.ReplaySubject(2);

// subscriber 1
subject.subscribe((data) => {
    console.log('Subscriber A:', data);
});

subject.next(Math.random())
subject.next(Math.random())
subject.next(Math.random())

// subscriber 2
subject.subscribe((data) => {
    console.log('Subscriber B:', data);
});

subject.next(Math.random());

// Subscriber A: 0.3541746356538569
// Subscriber A: 0.12137498878080955
// Subscriber A: 0.531935186034298
// Subscriber B: 0.12137498878080955
// Subscriber B: 0.531935186034298
// Subscriber A: 0.6664809293975393
// Subscriber B: 0.6664809293975393

代码源:Understanding rxjs BehaviorSubject, ReplaySubject and AsyncSubject