首页 > 解决方案 > RxJS - 只订阅一次但不完成 Observable

问题描述

想象一下当你有一些Observable包含实时变化的数据的情况,下面的例子......

interface User {
   name: string;
   projectId: string;
   dataThatChangesALotInRealTime: Object;
}

userData: Observable<User>

这个userDataobservable 在组件中用于显示一些实时变化的数据。例如

<p>
{{ (userData | async)?.dataThatChangesALotInRealTime }}
</p>

userData现在我想根据observable中的当前数据向数据库中插入一些数据。这是功能

addToDatabase() {
  let sub = this.userData.subscribe(data => {
     this.exampleDatabase.doc(`test/${data.dataThatChangesALotInRealTime.id}`)
          .add({ test: 'hello'})
     sub.unsubscribe() // <- This
  })
}

问题

这是取消订阅内部订阅以避免多次插入数据库的正确解决方案吗?有没有不同/更好的方法来做到这一点?

这只是一个简单的例子,如果你有一些问题或者我的解释很差,请在评论中告诉我,我会更新我的问题。谢谢

标签: angularrxjsobservablesubscriptionunsubscribe

解决方案


您可以使用first运算符:

this.userData.pipe(first()).subscribe(...);

这将在第一个值发出后自动完成(因此取消订阅)。

请注意,您应该确保它在完成之前至少发出一次,否则将引发错误。如果你不能确保这一点,你可以使用take(1)

this.userData.pipe(take(1)).subscribe(...);

请注意,这实际上并没有userData直接修改 observable,因此对其的其他订阅将继续发射。这是因为 rxjs 中的操作符不会修改 observable,而是返回一个新的 observable。


推荐阅读