2016-07-29 2 views
2

RxJS 5Angular 2 RC4アプリ:RxJS 5 Observableソースは、別のチェーンによって停止されますか? <code>Typescript 1.9</code>で書かれ

私はチェーンに2つの観測を持っています。私は条件が2番目に満たされれば、最初のものがすぐに完了するようにしたいと思います。私の努力は不必要に複雑なようです。ここで

source = Observable.interval(1000) 
     .do(()=>this.print("*******EMITTING from Source*******")) 
     .switchMap(count => { 
      if(count<3){ //just pass along the value 
       return Observable.create(observer=>{ 
        observer.next(count);observer.complete() 
       })     
      } 
      else{ //abort by issuing a non-productive observable 
       return Observable.create(observer=> 
        observer.complete() 
       ) 
      } 
     }) 
this.source.subscribe(count=>this.print('Ouput is '+count); 

が出力されます:それは3つの値を放射された後、以下の例では、私が最初に観察を停止しよう

*******EMITTING from Source******* 
Output is 0 
*******EMITTING from Source******* 
Output is 1 
*******EMITTING from Source******* 
Output is 2 
*******EMITTING from Source******* 
*******EMITTING from Source******* 
*******EMITTING from Source******* 

ので、機能的に、私は広いので、欲しい結果を得ますスクリプトは3つの出力後に通知を受け取るのを止めます。しかし、私は良い方法があると確信しています。私の問題は次のとおりです。

  1. 上流の観測は永遠に続きます。どうすればそれを止めることができますか?
  2. 私はすべての排出物についてチェーンの下に新しい観測値を作成しています。私はちょうど最初の3つの値を渡すことができますが、4日にチェーンを中止または完了することはできませんか?

答えて

5

take operatorを使用してください。 takeは最初のN個のイベントを取り、ストリームを完成させます。

this.source = Observable.interval(1000) 
    .do(()=>this.print("*******EMITTING from Source*******")) 
    .take(3); 
this.source.subscribe(count=>this.print('Ouput is '+count); 

とき、内側の流れを完全switchMapの外側の流れが完了していないので、あなたの例のストリームが完了しません。 switchMap()map().switch()に等しい。あなたの例では、map一部が発する観測等

  1. 次(0)、完全な()
  2. 次の(1)、完全な()
  3. 次の(2)、完全な()
  4. 完全()
  5. 完全()
  6. 完全()
  7. 完全()
  8. ...(無限に続く)...

部分は、これらの観測値を切り替え、今後の観測値を待っています。あなたは、内側ストリーム発する場合は、ストリームを終了したい場合は、あなたのコメントについて

source = Observable.interval(1000) 
     .do(()=>this.print("*******EMITTING from Source*******")) 
     .takeWhile(count => count < 3); 

EDIT 2

EDIT

あなたの例では、のように書くこともできましたtrue

source = Observable.interval(1000) 
     .do(()=>this.print("*******EMITTING from Source*******")) 
     .switchMap(count => createSomeObservable(count)) 
     .takeWhile(x => x !== true); 
+0

チップをありがとう。 '.take()'はここで動作します(+1)。私はこれを単純な例として使った。私のより大きな質問は、(可能であれば)いくつかの状態に基づいて第2から第1観察可能なものを完成させる方法です。たとえば、チェーン内に2つのオブザーバブルがあり、最初のオブザーバブルが「真」を出すならば、すべての作業を中止したいと思う。多分 'takeUntil()'がやることでしょう – BeetleJuice

+0

''チェーンの中の2つのオブザーバブル 'とはどういう意味ですか?おそらく 'takeXxx'演算子はあなたが推測するようにあなたを助けるでしょう。 ところでこの記事は 'takeXxx'演算子についての私の目玉でした。 https://medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87#.tkmznu7ho –

+0

私のOPはチェーン内に2つの観測値を持っています( 'switchMap'は2番目を出力します)。私はちょうどその中からストリームを殺す/完了する方法を探しています、そして、私はオペレーターがそれを私にさせるでしょう。あなたがリンクした記事を読んでみましょう。 – BeetleJuice

関連する問題