RxJS-仅订阅一次,但不完成Observable

Rao*_*old 5 subscription unsubscribe observable rxjs angular

设想一下其中Observable包含实时变化数据的情况,下面的示例...

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

userData: Observable<User>
Run Code Online (Sandbox Code Playgroud)

userData可观察值用于组件中以显示一些实时更改的数据。例如

<p>
{{ (userData | async)?.dataThatChangesALotInRealTime }}
</p>
Run Code Online (Sandbox Code Playgroud)

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

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

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

这只是一个简单的示例,如果您有任何问题或我的解释不力,请在评论中让我知道,我将更新我的问题。谢谢

Ing*_*ürk 8

您可以使用first运算符:

this.userData.pipe(first()).subscribe(...);
Run Code Online (Sandbox Code Playgroud)

发出第一个值后,此操作将自动完成(并因此取消订阅)。

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

this.userData.pipe(take(1)).subscribe(...);
Run Code Online (Sandbox Code Playgroud)

请注意,这实际上并没有userData直接修改可观察对象,因此无论如何它的其他订阅都将继续发出。这是因为rxjs中的运算符不会修改可观察变量,而是返回一个新的可观察变量。