2016-08-02 2 views
0

Как подождать один поток (скажем, StreamA), чтобы вернуть ненулевое значение, а затем вызвать функцию подписки StreamB. Меня не особо интересует ценность StreamA. В свою очередь, я пытаюсь получить значение StreamB, которое могло быть обновлено до того, как StreamA вернет ненулевое значение и может не иметь никаких новых событий.Дождитесь потока перед вызовом другого потока

Я попытался, pausable, посмотрев на это: RxJS: How can I do an "if" with Observables?, но, к сожалению, он не смог заставить его работать. Это связано с тем, что нет экспортированного класса pausable, rxjs v 5.0.0-beta.6.

Вот как далеко я пришел с ответом.

export class AuthService { userModel: FirebaseListObservable = this.af.database.list (/users); конструктор (частный аф: 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(); 
    } 

Надежда, я могу сделать себе ясно. Даже сейчас я запутался. :п.

Я новичок в rxjs и реактивном программировании. И любая помощь будет оценена.

И, кстати, спасибо, что остановились. :)

ответ

1

Я полагаю, что plausible Вы имеете в виду pausable? Я не уверен, что именно вы пытаетесь достичь здесь (поток управления?). Однако, если вы хотите, чтобы значение streamB после того, как streamA произвело значение, вы можете использовать flatMap.

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

Это должно дать вам, в любое время streamA излучает значения, испускаемые после этого времени с помощью streamB.

Если вы хотите значения, включая один последний B излучаемого до этого времени, вы можете использовать streamBB = streamB.publishReplay(1) и

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

не проверял, так что держите меня в курсе, если это работает.

+0

Я добавил код, чтобы сделать вас немного понятнее. (Надеюсь, это поможет). Кроме того, с приведенным выше кодом я получаю следующую ошибку в TS Compiler. 'Свойство 'publishReplay' не существует для типа 'FirebaseListObservable ' .' – ankitjain11

+0

ну, вам нужно взглянуть на ваши типы. В 'flatMapLatest' вы увидите, что он является наблюдаемым, который возвращается. Поэтому проверьте, что ваш «FirebaseListObservable» действительно является наблюдаемым. Вы можете найти 'publishReplay' здесь' http: // reactivex.io/rxjs/class/es6/Observable.js ~ Observable.html', поэтому он определенно должен быть частью Rxjs v5. – user3743222

+1

'flatMapLatest' должен быть' switchMap' в RxJS 5 – subhaze

Смежные вопросы