我试图将两个对 Spotify API 的异步调用链接在一起 - 一个获取播放列表的名称,另一个创建播放列表,如果它不存在于检索的播放列表列表中。目前,我用于确定播放列表是否已存在的代码如下所示:
containsPlaylist(playlistToCreate: string): Observable<any> {
this.spotifyService.getUserPlaylists().flatMap(data => data.items).map((item: Track) => item.name).subscribe(name => {
console.log(name);
if (name === playlistToCreate) {
console.log('returning true');
return Observable.of(true);
}
});
console.log('returning false');
return Observable.of(false);
}
但是,这显然是有缺陷的,因为异步调用 getUserPlaylists() 在到达“Observable.of(false)”语句之前不必返回。因此,即使调用最终返回, containsPlaylist 也已经返回 false (据我所知)。我相信是这样,因为控制台将按以下顺序打印 console.log 语句:
'返回假','播放列表存在:假','创建播放列表','返回真'
下面是 containsPlaylist 被调用的地方,它只是检查函数是否返回 true 或 false。
this.containsPlaylist(this.playlistToCreate).subscribe(playlistExists => {
console.log('playlist exists: ' + playlistExists);
if (!playlistExists) {
console.log('creating playlist')
this.spotifyService.createPlaylist(this.playlistToCreate, this.spotifyUser.id).subscribe(data => data);
}
});
所以我的问题是:
我怎样才能让 Observable.of(false) 语句像 Observable.of(true) 语句一样在我的订阅中返回?
或者,如果这是错误的思考方式,我该如何修改 containsPlaylist 以正确返回 getUserPlaylists 返回的现有播放列表中是否包含 playlistToCreate。谢谢!
你让它变得比必要的要困难得多。一般来说,当你有一个 observable,但想要另一个,你不应该订阅。相反,您应该使用运算符:
containsPlaylist(playlistToCreate: string): Observable<boolean> {
return this.spotifyService.getUserPlaylists().
.map(arrayOfTracks => arrayOfTracks.some(track => track.name === playlistToCreate));
}
然后,如果第一个 observable 发出 false,您可以只使用 switchMap,而不是在 subscribe 回调中订阅:
this.containsPlaylist(this.playlistToCreate)
.filter(result => !result)
.switchMap(() => this.spotifyService.createPlaylist(this.playlistToCreate, this.spotifyUser.id))
.subscribe(() => {});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句