基于 Angular 5 observable.subscribe() 中的单个值有条件地返回用于将异步调用链接在一起

约翰·斯通

我试图将两个对 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。谢谢!

JB尼泽

你让它变得比必要的要困难得多。一般来说,当你有一个 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Angular 2中的ChangeDetectionStrategy.OnPush和Observable.subscribe

如何使用 Subscribe Observable 在 Angular 中执行查找

在Firebase中的Angular中使用Observable和Subscribe

Angular 5 - 类型 '() => Observable<any>' 上不存在属性 'subscribe'

带有 Observable 的 Angular 2 Http 请求。如何使用 .subscribe 处理数据

基于两个 observable 的 Angular Guard

Angular:如何在随后的Observable中使用`.subscribe()`的结果

Angular 5:从函数返回一个Observable

Angular 5-Observable-将Observable的第一个值设置为表单组

从 Angular5 http.get 返回 observable

Angular 9 从 Observable 返回 Observable

在Angular 5 http请求中使用observable有什么好处?

Angular 6多次调用subscribe()

基于条件的angular5样式背景颜色

Angular 中的多个嵌套 .subscribe

基于表单输入的Angular 5 ngModel设置默认值

在Angular中渲染基于时间的Observable,而无需压倒性的变化检测

Angular 5 Rxjs Subject.subscribe()未在多个组件中触发

rxjs中基于boolean observable的条件observable转换

在 Angular 2 App 中返回一个 Observable,但仍然出现错误:“属性 'subscribe' 在类型 'void' 上不存在

Observable.from subscribe 闭包被调用两次

使用Router.navigate()后未调用Observable.subscribe()

明确订阅Observable与使用参数调用subscribe()之间的实际区别

更改 observables 时,subscribe 内的 Observable 值未定义

从 Angular 5 中的 http.get 返回单个项目的 Observable

Android Studio中突出显示的RxAndroid`Observable ... subscribe`

Angular Observable 被多次调用

Angular 6 返回 Observable

Angular catchError 并返回 observable