我正在尝试编写访问Spotify api的服务。因此,此服务需要授权承载令牌。它应该从另一个服务获得此服务,该服务返回一个可观察值。如何将它们放在一起?
我的第一次尝试是这样的:
getSpotifyData(spotifyId: string): Observable<string> {
let url = "https://api.spotify.com/v1/tracks/" + spotifyId;
this.config.getSpotifyToken().subscribe(bearer => {
return this.http.get<string>(url, {headers: {"Authorization": "Bearer " + bearer}});
});
}
这里的问题是,无论配置服务是否起作用,此方法都必须返回Observable。现在不是这种情况。
是否可以将两个可观察的对象合并在一起,以便我的方法可以返回一个合并的可观察的对象?
答案 0 :(得分:4)
您应该为此使用switchMap()
。
getSpotifyData(spotifyId: string): Observable<string> {
let url = "https://api.spotify.com/v1/tracks/" + spotifyId;
return this.config.getSpotifyToken().pipe(
switchMap((bearer: string) => {
return this.http.get<string>(url, {headers: {"Authorization": "Bearer " + bearer}});
}),
);
}
在这种情况下,您将获得承载,然后在switchMap函数中使用它,整个getSpotifyData()
函数将返回一个Observable。然后,在需要的地方订阅它。