如何解决从打字稿中的可观察值中提取值
我的user$: Observable<User>;
中有AuthService
。我也有OrderService
。我想基于User.id发出请求(获取所有用户订单)。
这是我的功能
getUserOrders() {
let id;
this.authService.user$.pipe(take(1)).subscribe(data => id = data.uid);
return this.firestore.collection('orders',ref => ref.where("purchaserId","==",id)).snapshotChanges().pipe(
map(changes => {
return changes.map(a => {
let data = a.payload.doc.data() as Order;
data.id = a.payload.doc.id;
return data;
});
})
);
}
问题是这一行:
let id;
this.authService.user$.pipe(take(1)).subscribe(data => id = data.uid);
因为调用return语句时id保持未定义状态。所以我得到错误Function Query.where() requires a valid third argument,but it was undefined.
我知道在html中使用异步管道很方便。但是我认为在打字稿中使用observable会更困难。我认为更好的解决方案是将user$: Observable<User>
更改为user: User
。
解决方法
这部分是异步的:
this.authService.user$.pipe(take(1)).subscribe(data => id = data.uid);
因此,调用 firestore.collection 时,id
尚未用data.uid
初始化。
您可以将getUserOrders
更改为:
return this.authService.user$.pipe(
take(1),switchMap(({uid}) => {
return return this.firestore.collection('orders',ref =>
ref.where("purchaserId","==",uid)).snapshotChanges().pipe(
map(changes => {
return changes.map(a => {
let data = a.payload.doc.data() as Order;
data.id = a.payload.doc.id;
return data;
});
})
);
})
)
获取ID后,它将使用提供的ID将返回的observable切换到firestore.collection。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。