2016-08-02 42 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