2016-08-02 84 views
0

如何等待一個流(例如,StreamA)返回非空值,然後調用StreamB訂閱功能。我對StreamA的價值並不特別感興趣。反過來,我試圖獲得StreamB的值,它可能在StreamA返回非空值之前更新過,並且可能沒有任何新事件。在調用另一個流之前等待流

我試過,可運用,通過看這個: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); 構造(私人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(); 
    } 

希望,我可以讓自己清楚。即使我現在感到困惑。 :P。

我是rxjs和反應式編程的新手。並且,任何幫助將不勝感激。

而且,順便說一句,謝謝你停下來。 :)

回答

1

我想你的意思是pausable?我不確定你到底想要達到什麼目的(控制流量?)。但是,如果要在streamA產生一個值之後想要streamB值,則可以使用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'應該是RxJS 5中的'switchMap' – subhaze