Angular 2 Observables - 返回原始的observable,而不是switchMap / combineLatest

时间:2017-01-26 05:33:18

标签: angular firebase

我有一个函数可以调用Firebase数据库,将多个用户配置文件数据聚合在一起。我遇到的一个问题是,如果用户的用户对象上没有videos属性,则会发现可观察到的错误。

现在,我正在检查用户对象上是否有任何视频。如果有,它返回一个新的observable,它根据从videos属性(数组)中获取的数据组合了一堆observable。但是,如果没有,我需要在.switchMap()之前返回原始的observable。

有人知道我需要在这里调整一下吗?

这是我的功能:

getUserProfile(id) {
    return this._af.database
      .object(`/social/users/${id}`)

      // Switch to the joined observable

      .switchMap((user) => {

        let vidKeys = Object.keys(user.videos);

        if(vidKeys && vidKeys.length > 0) {
          // Use forkJoin to join the video observables. The observables will
          // need to complete, so first is used. And use forkJoin's selector to
          // map the videos to the user and then return the user.

          return Observable.combineLatest(
            vidKeys.map((vidKey) => this._af.database
              .object(`/social/videos/${vidKey}`)
            ),
            (...videos) => {
              vidKeys.forEach((vidKey, index) => {

                // Query YouTube api to get the duration
                this._yt.getVideo(vidKey).subscribe(data => {

                  // Format the duration
                  let duration = this._yt.convertToStandardDuration(data.items[0].contentDetails.duration)
                  videos[index]['duration'] = duration;
                  user.videos[vidKey] = videos[index];

                });

               });
              return user;
            }
          )
        } else {

          // TO-DO: Return original observable that was called before the .switchMap()

        }
      });
  }

1 个答案:

答案 0 :(得分:2)

您不必返回原始的observable,只需返回一个发出原始值的observable,因为当原始observable重新发出时将调用switchMap。您可以使用Observable.of

执行此操作
import 'rxjs/add/observable/of';

getUserProfile(id) {
  return this._af.database
    .object(`/social/users/${id}`)
    .switchMap((user) => {

      let vidKeys = Object.keys(user.videos);

      if(vidKeys && vidKeys.length > 0) {
        ...
      } else {
        return Observable.of(user);
      }
    });
}