Ich habe eine Funktion, die einige Aufrufe an eine Firebase-Datenbank, die eine Reihe von Benutzerprofildaten zusammen aggregiert. Das einzige Problem, auf das ich stoße, ist, wenn die Benutzer keine videos
Eigenschaft auf ihrem Benutzerobjekt haben, die beobachtbaren Fehler heraus.Angular 2 Observables - Return Original beobachtbar, anstelle von switchMap/combateLatest
Im Moment überprüfe ich, ob es Videos auf dem Benutzerobjekt gibt. Wenn dies der Fall ist, wird eine neue Observable zurückgegeben, die eine Reihe von Observablen basierend auf den Daten, die sie von der videos
Eigenschaft (einem Array) abruft, kombiniert. Wenn dies nicht der Fall ist, muss ich das ursprüngliche Observable vor dem .switchMap()
zurückgeben.
Weiß jemand, was ich hier zwicken muss?
Hier ist meine Funktion:
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()
}
});
}
Sie speichern mich noch einmal. Würdest du glauben, dass ich tatsächlich etwas wie 'return Observable.of ([])' versuchte, nur um zu sehen, ob der Anruf vervollständigt werden würde? :) Danke noch einmal. Prost! –