angular - 如何判断 Observable 的值是否发生变化或最终值已被设置
我有一个类型为 returnDate: Observable<string> 的变量,其值是从另一个类型为 Observable 的函数设置的,看起来像这样:
getDates(): Observable<string> {
return new Observable((observer) => {
observer.next(moment(this.data.Date).format('DD MMM'));}
});
}
现在我如何检测或知道 returnDate 的值是否已被更改,或者 observable 是否收到了另一个值。基本上,我正在使用这些 observables 改变日期,所以我需要知道对于一个特定对象(this.data.Date),给定的值是否已被更改(observer.next 是否已完成),或者可能有类似 final/finalize 的 helper 函数用于 observables。
答案#1
虽然从你分享的代码中很难理解你到底是如何做到这一点的。但就你的问题而言——
所以我需要知道对于一个特定对象(this.data.Date),给定的值是否已被更改
在rxjs observables的情况下,有一个操作符distinctUntilChanged,它的作用完全相同。在这里阅读。
仅当当前值与上一次不同时才发出。
一个示例解决方案
getDates.pipe(distinctUntilChanged())
.subscribe(data => console.log("This will only hit if data changed"));
看看这对你有用吗。
答案#2
如果你每次在订阅的地方都返回一个 new Observable(),你会得到不同的值。例如,你返回 return new Observable(Math.random()*10),并且在两个组件中订阅,你会得到不同的值,但我认为你希望得到相同的值,所以在这种情况下使用 Subject()
首先你必须声明它,然后设置值,然后返回 this.subject.asObservable(),这给你机会订阅这个主题。
简单例子
// set initial value to subject, ussualy set data above constructor
dataSubject = new BehaviorSubject(null);
// then you get data from server
// response can be data from serve or data from eventEmitter whatever you need
this.dataSubject.next(response);
// then return this subject
return this.dataSubject.asObservable()
在这种情况下使用 BehaviorSubject,因为它可以保存值,并且你可以设置主题的初始值
如果你有更多问题,随时可以问。
