2016-08-02 15 views
0

Wie warte ich darauf, dass ein Stream (z. B. StreamA) einen Nicht-Null-Wert zurückgibt und dann die StreamB-Subskriptionsfunktion aufruft. Ich bin nicht besonders interessiert an StreamA Wert. Ich versuche wiederum, den Wert StreamB zu erhalten, der möglicherweise aktualisiert wurde, bevor der StreamA einen Nicht-Null-Wert zurückgegeben hat und möglicherweise keine neuen Ereignisse hat.Auf einen Stream warten, bevor ein anderer Stream aufgerufen wird

Ich versuchte, pausable, indem Sie auf diese: RxJS: How can I do an "if" with Observables?, aber konnte leider nicht zur Arbeit. Dies liegt daran, dass es keine exportierte Klasse pausable, rxjs v 5.0.0-beta.6 gibt.

Dies ist, wie weit, habe ich, wie in der Antwort.

Export-Klasse AuthService { userModel: FirebaseListObservable = this.af.database.list (/users); Konstruktor (privat af: AngularFire) {

var user = this.currentAuthor(); 
    var userStream = user; 

    this.af.auth.flatMap((d) => { console.log(d);return this.userModel.publishReplay(1); }); 

    this.userModel 
     .subscribe((data) => { 
     var flag = false; 
     data.forEach((item) => { 
      if (item.$key && item.$key === user.uid) { 
      flag = true; 
      return; 
      } 
     }); 

     if (flag) { 
      console.log('hello'); 
     } else { 
      this.userModel.push({ 
       firstName: user.auth.displayName.substr(0, user.auth.displayName.lastIndexOf(' ')), 
       lastName: user.auth.displayName.substr(user.auth.displayName.lastIndexOf(' '), user.auth.displayName.length), 
       displayPic: user.auth.photoURL, 
       provider: user.provider, 
       uid: user.uid 
      } 
     ); 
     } 
     }) 
    } 
    public currentAuthor():FirebaseAuthState { 
    return this.af.auth.getAuth(); 
    } 

Hope, kann ich mich klar ausgedrückt. Sogar ich werde jetzt verwirrt. : p.

Ich bin neu in RXJS und reaktive Programmierung. Und jede Hilfe wird geschätzt.

Und, btw, danke fürs vorbeischauen. :)

Antwort

1

Ich nehme an durch plausible meinen Sie pausable? Ich bin mir nicht sicher, was genau Sie hier erreichen wollen (Kontrollfluss?). Wenn Sie jedoch streamB-Wert verwenden möchten, nachdem streamA einen Wert erzeugt hat, können Sie flatMap verwenden.

streamA.flatMapLatest(function (_){return streamB})

Dass Sie geben sollten, zu jeder Zeit streamA aussendet, die nach dieser Zeit emittiert Werte von streamB.

Wenn Sie Werte wollen, einschließlich der letzten vor dieser Zeit emittiert ein B, können Sie streamBB = streamB.publishReplay(1) und

streamA.flatMapLatest(function (_){return streamBB})

habe es nicht getestet, also halten Sie mich auf dem Laufenden, ob das funktioniert.

+0

Ich habe den Code hinzugefügt, um Ihnen die Dinge etwas klarer zu machen. (Ich hoffe, das hilft). Mit dem obigen Code erhalte ich auch den folgenden Fehler im TS Compiler. 'Eigenschaft 'publishReplay' existiert nicht für den Typ 'FirebaseListObservable ' .' – ankitjain11

+0

Nun, Sie müssen sich Ihre Typen ansehen. Im 'flatMapLatest' werden Sie sehen, dass es sich um eine Observable handelt, die zurückgegeben wird. Überprüfen Sie also, ob Ihr 'FirebaseListObservable' wirklich beobachtbar ist. Sie finden 'publishReplay' hier' http: // reactivex.io/rxjs/class/es6/Observable.js ~ Observable.html', also sollte es definitiv Teil von Rxjs v5 sein. – user3743222

+1

'flatMapLatest' sollte' switchMap' in RxJS 5 sein – subhaze

Verwandte Themen