我对RxJS和异步数据没有太多的经验。我一直在嵌套订阅,感觉不太对劲。我想知道组合或使用多个数据点的正确方法是什么,比如获取用户个人资料和他们的帖子。这是我目前所拥有的:
constructor(private storage: AngularFireStorage, private db: AngularFirestore, private route: ActivatedRoute) {
// Get profile
this.route.paramMap.subscribe(params => {
const profileName = params.get('id');
const username = db.doc<any>('usernames/' + profileName).valueChanges();
username.subscribe(val => {
this.user = db.doc<User>('users/' + val.user).valueChanges();
this.user.subscribe(val => {
const userPosts = this.db.collection<Post>('posts', ref => ref.where('user', '==', val.uid)).snapshotChanges();
this.posts = userPosts.pipe(map(actions => actions.map(a => {
const data = a.payload.doc.data() as Post;
const mediaUrl = this.storage.ref('post/m/' + data.mediaM).getDownloadURL();
const userData: Observable<User> = db.doc<User>('users/' + data.user).valueChanges();
return {mediaUrl, userData, ...data}
})))
});
});
});
}发布于 2020-08-30 09:24:32
您可以使用switchMap将结果从一个可观察对象传递到另一个可观察对象,这样就不需要嵌套订阅。
this.route.paramMap.pipe(
map(params => params.get('id')),
switchMap(profileName => db.doc<any>('usernames/' + profileName).valueChanges()),
switchMap(val => db.doc<User>('users/' + val.user).valueChanges()),
switchMap(val => this.db.collection<Post>('posts', ref => ref.where('user', '==', val.uid)).snapshotChanges())
).subscribe(val => {});https://stackoverflow.com/questions/63653058
复制相似问题