我们如何在每次订阅可观察的角度时获得OLD数据

  • 本文关键字:数据 OLD 观察 我们 angular
  • 更新时间 :
  • 英文 :


最近我遇到了这个需求,我在3个不同的for循环中订阅了3次observable。

我每次都会得到最新的数据。我们如何在每次订阅可观察的角度时获得OLD数据?

您可以使用ReplaySubject来"Replays"或向新订阅者发送旧值:

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

代码来源:理解rxjsBehaviorSubject、ReplaySubject和AsyncSubject

您可以为此使用服务属性或组件属性。如果您想将数据保持在组件本地,那么使用一个属性,并在下一个回调中继续推送该属性中接收到的数据。另一方面,如果您想与另一个组件共享数据/逻辑,则使用相同的推送数据方法的服务,并将服务注入您想要使用的另一个部件中。(不要忘记使用相同的服务实例(
服务

您需要自己跟踪旧值,因为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
});
}
}

相关内容

最新更新