如何从Firestore DocumentReference数组字段创建可观察数组

时间:2019-08-12 16:28:04

标签: angular rxjs google-cloud-firestore angularfire

我正在构建用于电子商务目的的Firestore数据库。目前,我有一个产品根目录集合和一个用户根目录集合。 users集合具有一个名为cart的数组字段,我在其中存储对该用户cart中每个项目的产品集合的Documentreferences。我不确定从DocumentReference数组中正确形成Private tmrTask As task Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown tmrTask = Task.Run(Sub() Do Me.BeginInvoke(Sub() If IsVPNConnected() Then BtnVPN.BackColor = Color.LightGreen BtnVPN.Text = "Connected" Else BtnVPN.BackColor = Color.Red BtnVPN.Text = "Disconnected" End If If IsInternetConnected() Then BtnInternet.BackColor = Color.LightGreen BtnInternet.Text = "Connected" Else BtnInternet.BackColor = Color.Red BtnInternet.Text = "Disconnected" End If End Sub) '<<< adjust sleep Threading.Thread.Sleep(1000) '<<< this would be the same as interval from timer Loop End Sub) End Sub 的最佳方法。

我目前有这样的作品,但是我很肯定这不是最好的方法,并且会在应用程序中引起问题。尤其是因为每次组件订阅此可观察项时,该服务都会为购物车中的每个项目创建一个新订阅,并且这些订阅永远不会取消订阅...

Observable<Product[]>

我希望能够查询已登录用户的该字段,并从购物车服务中返回一个// Current method from cart service getItems(): Observable<Product[]> { return this.auth.user.pipe( map((user: User): Product[] => { this.items = []; user.cart.forEach((item: firestore.DocumentReference) => { this.afs.doc(item.path).valueChanges().pipe( map((product: Product) => { this.items.push(product); }) ).subscribe(); }); return this.items; }) ); } ,我可以订阅该服务并用于在组件中的用户购物车中显示项目。我对rxjs库的了解和理解还很初级,并且可能有一个运算符可以正确完成这项工作。预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

要取消订阅firestore中创建的service可观察项,请尝试以下操作

<!-- someName.component.ts -->
import {Subscription} from 'rxjs';

在您的组件类中

 private firestoreSubscription: Subscription;

/* Your method to get data from firestore service */
getCartData(){
this.firestoreSubscription = this.service.getItems()
.subsribe(data=>//your stuff);
}

并在ngOnDestroy()的{​​{1}}生命周期挂钩中取消订阅

Angular