AngularFire2 firestore take(1) 文档 valueChanges
AngularFire2 firestore take(1) on doc valueChanges
我尝试使用 AngularFire2 从单个 Firestore 文档中获取数据。 有效的是:
this.addressRef = afs.doc<Address>('addresses/key')
this.addressRef.valueChanges().subscribe(val => {......}
我只想运行订阅代码一次。通常我使用 take(1) 来实现这个(与 Firebase DB 一起使用)。 但是这段代码:
this.addressRef.valueChanges().take(1).subscribe(val => {......}
给出错误: TypeError: this.addressRef.valueChanges(...).take 不是一个函数。
VS Code 正在列出采取行动。这是 AngularFire2 中的错误吗,我做错了吗,还是有其他(更好的)方法来在获取数据后停止订阅?我也曾尝试过承诺,但这也失败了。
更新
因为这个答案受到了很多关注,所以我提供了一个更新的答案。通常,在使用可观察对象编程时,您应该尝试反应式思考。有一些很棒的教程,但是 this one is 很好。
新解
user$ = this.afDs.doc<User>('users/NaGjauNy3vYOzp759xsc')
.valueChanges().pipe(
take(1) // Here you can limit to only emit once, using the take operator
)
并且在您的模板中,您订阅了您的 observable。
{{(user$ | async).name}}
上下文
这种解决问题的方法有很多好处:
- 如果你不想转换数据,你只需输入一个映射运算符
- 您可以使用 rxjs 过滤器运算符过滤事件
- 创建其他流,基于 user$ 流
- 易于调试,因为其他开发人员可以更透明地查看您应用中的数据流
例如(创建另一个流,只有当用户是管理员时才会发出,并创建一个新标题):
adminTitle$ = this.user$.pipe(
filter(user => user.title === 'admin'),
map(user => `${user.name} (admin)`)
)
旧答案
您可以通过执行以下操作实现此目的:
this.userDoc = afDs.doc<User>('users/NaGjauNy3vYOzp759xsc');
this.userDoc.valueChanges()
.pipe(take(1))
.subscribe(v => {
this.user = v;
});
我尝试使用 AngularFire2 从单个 Firestore 文档中获取数据。 有效的是:
this.addressRef = afs.doc<Address>('addresses/key')
this.addressRef.valueChanges().subscribe(val => {......}
我只想运行订阅代码一次。通常我使用 take(1) 来实现这个(与 Firebase DB 一起使用)。 但是这段代码:
this.addressRef.valueChanges().take(1).subscribe(val => {......}
给出错误: TypeError: this.addressRef.valueChanges(...).take 不是一个函数。
VS Code 正在列出采取行动。这是 AngularFire2 中的错误吗,我做错了吗,还是有其他(更好的)方法来在获取数据后停止订阅?我也曾尝试过承诺,但这也失败了。
更新
因为这个答案受到了很多关注,所以我提供了一个更新的答案。通常,在使用可观察对象编程时,您应该尝试反应式思考。有一些很棒的教程,但是 this one is 很好。
新解
user$ = this.afDs.doc<User>('users/NaGjauNy3vYOzp759xsc')
.valueChanges().pipe(
take(1) // Here you can limit to only emit once, using the take operator
)
并且在您的模板中,您订阅了您的 observable。
{{(user$ | async).name}}
上下文
这种解决问题的方法有很多好处:
- 如果你不想转换数据,你只需输入一个映射运算符
- 您可以使用 rxjs 过滤器运算符过滤事件
- 创建其他流,基于 user$ 流
- 易于调试,因为其他开发人员可以更透明地查看您应用中的数据流
例如(创建另一个流,只有当用户是管理员时才会发出,并创建一个新标题):
adminTitle$ = this.user$.pipe(
filter(user => user.title === 'admin'),
map(user => `${user.name} (admin)`)
)
旧答案
您可以通过执行以下操作实现此目的:
this.userDoc = afDs.doc<User>('users/NaGjauNy3vYOzp759xsc');
this.userDoc.valueChanges()
.pipe(take(1))
.subscribe(v => {
this.user = v;
});