gpt4 book ai didi

AngularFire2 firestore take(1) 文档 valueChanges

转载 作者:太空狗 更新时间:2023-10-29 18:05:12 26 4
gpt4 key购买 nike

我尝试使用 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 => {......}

给出错误:类型错误:this.addressRef.valueChanges(...).take 不是一个函数。

VS Code 正在列出采取行动。这是 AngularFire2 中的错误吗,我做错了吗,还是有其他(更好的)方法来在获取数据后停止订阅?我也尝试过 promise ,但这也失败了。

最佳答案

更新

因为这个答案受到了很多关注,所以我提供了一个更新的答案。通常,在使用可观察对象编程时,您应该尝试响应式(Reactive)思考。有一些很棒的教程,但是 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
)

在您的模板中,您订阅了您的可观察对象。

{{(user$ | async).name}}

上下文

这种解决问题的方法有很多好处:

  • 如果你不想转换数据,你只需加入一个 map 运算符
  • 您可以使用 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 take(1) 文档 valueChanges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46654670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com