网站搜索

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,因为它可以保存值,并且你可以设置主题的初始值

如果你有更多问题,随时可以问。