2017-01-26 6 views
2

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() 

     } 
     }); 
    } 

Antwort

2

Sie müssen Sie nur eine beobachtbare zurückkehren haben nicht die ursprüngliche beobachtbaren zurückgeben, die den ursprünglichen Wert abgibt, wie die switchMap werden, wenn Original beobachtbaren aufgerufen werden Re-emittiert. Sie können das mit 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); 
     } 
    }); 
} 
+0

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! –

Verwandte Themen