angular - RxJS - 只订阅一次但不完成 Observable
问题描述
想象一下当你有一些Observable
包含实时变化的数据的情况,下面的例子......
interface User {
name: string;
projectId: string;
dataThatChangesALotInRealTime: Object;
}
userData: Observable<User>
这个userData
observable 在组件中用于显示一些实时变化的数据。例如
<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
})
}
问题
这是取消订阅内部订阅以避免多次插入数据库的正确解决方案吗?有没有不同/更好的方法来做到这一点?
这只是一个简单的例子,如果你有一些问题或者我的解释很差,请在评论中告诉我,我会更新我的问题。谢谢
解决方案
您可以使用first
运算符:
this.userData.pipe(first()).subscribe(...);
这将在第一个值发出后自动完成(因此取消订阅)。
请注意,您应该确保它在完成之前至少发出一次,否则将引发错误。如果你不能确保这一点,你可以使用take(1)
:
this.userData.pipe(take(1)).subscribe(...);
请注意,这实际上并没有userData
直接修改 observable,因此对其的其他订阅将继续发射。这是因为 rxjs 中的操作符不会修改 observable,而是返回一个新的 observable。
推荐阅读
- ag-grid - 在网格的每个过滤器旁边显示行数
- c - 我自己的 sqrt() 函数中的错误在哪里?
- jquery - 为 jquery 扩展编写 typescript 类型定义
- javascript - Javascript 不是数字
- html - 创建具有相同大小的响应式图像库
- python - jupyter笔记本中的内存错误
- selenium - driver=self.driver AttributeError: 'loginpage' 对象没有属性 'driver'
- php - 我该如何处理我行为不端的购物车
- angular - Typescript - 使用“\n”在字符串中创建新行
- c# - Visual Studio 项目文件格式 - 那个“新的”有实际名称吗?