我正在构建用于电子商务目的的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库的了解和理解还很初级,并且可能有一个运算符可以正确完成这项工作。预先感谢您的帮助!
答案 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