我有一个函数可以调用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()
}
});
}
答案 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);
}
});
}