我知道它被问了百万次,但我真的不明白它是如何工作的。我尝试了新的 Promise,但里面没有任何东西then()
我试图用 mergeMap 来做,但搞砸了。我想获取当前用户最喜欢的项目。为此,我正在调用此方法:
user: IUser;
tracks: ITrack[] = [];
public getFavorites() {
this.userService.getFavourite(this.user.id).subscribe(
(tracks: ILike[]) => {
if (tracks) {
tracks.forEach(track => {
this.tracks.push(this.loadTracks(track.id));
});
}
}
);
对于这种方法,我需要这样的用户 ID,并且:
private async loadUser() {
this.accountService.currentUser$.subscribe((user: IUser) => {
// getting into another service, because currentUser don't have id
this.userService.getUserByUsername(user.username).subscribe((u: IUser) => {
this.user = u;
})
})
}
还有track_id:
loadTracks(id: number) {
let track: ITrack;
this.trackService.getTrack(id).subscribe(t => track = t);
return track;
}
通过 OnInit ():
this.loadUser();
this.getFavorites();
如何正确使用mergeMap?
我想你会想switchMap
在这种情况下使用。
this.accountService.currentUser$.pipe(
switchMap((user: IUser)=> {
return this.userService.getUserByUsername(user.username);
}),
tap(user => {
console.log(user); // Check if its work
}),
switchMap(user => {
return this.userService.getFavourite(this.user.id)
}),
tap(tracks => {
console.log(tracks); // Now you have track
})
); // You can .subscribe() here or use async pipe
您还可以拆分此逻辑并重用
const getUser$ = this.accountService.currentUser$.pipe(
switchMap((user: IUser)=> {
return this.userService.getUserByUsername(user.username);
})
);
在此处阅读有关高阶可观察的更多信息
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句