2017-02-02 8 views
3

新しい決議を与えられた後任者が既に機内にいる場合、同じ約束を待っている複数の加入者を解決するにはどうすればよいですか?RxJs - 約束の同じ結果を待っている複数の加入者

doSomething =() => { 
    return new Promise((resolve) => { 
    setTimeout(() => resolve(Math.random(), 1000) 
    }) 
} 

// how to define obs? 

obs.subscribe(v => console.log(v)); // 0.39458743297857473 
obs.subscribe(v => console.log(v)); // 0.39458743297857473 
obs.subscribe(v => console.log(v)); // 0.39458743297857473 

setTimeout(() => obs.subscribe(v => console.log(v)), 2000); // 0.9485769395265746 

私は、観察結果は、後続のすべての同時加入者にストリーミングされた後、再び冷たい行き、その後、第1の加入者まで冷たいままにしたいと思います。私は基本的に同じ基本的な機能への同時リクエストを望んでいません。

答えて

3

あなたは、ストリームの作成、オペレーターとしてdeferを使用して、shareことができます。ドキュメントへのリンクはいいだろうが、

doSomething =() => { 
    return new Promise((resolve) => { 
    setTimeout(() => resolve(Math.random(), 1000)); 
    }); 
} 

const obs = Rx.Observable 
    .defer(doSomething) 
    .share(); 

obs.subscribe(console.log); // resolve #1 
obs.subscribe(console.log); // resolve #1 
obs.subscribe(console.log); // resolve #1 

setTimeout(() => obs.subscribe(console.log), 2000); // resolve #2 
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script> 
+2

ニースの答えを! –

+1

良い点、ドキュメントへのリンクをいくつか追加しました。 – olsn

+0

これは私が与えた例のために働くので、私は受け入れました。ご協力いただき誠にありがとうございます。私は事を単純化するために私が与えた例とは対照的に、実際にはそれを実際に試してみました。私は今なぜそれが動作しません参照してください、それはリエントラントではありません。 obsを使用するパイプラインの終わりには、購読するライブラリーコードがあり、onNextブロックで、それは... drumroll ... obsに依存してデッドロックされたアクションを生成していました。私はこれらの血まみれの恐ろしい縁のケースで私はいつも終わるのか分かりません! :-) – mysomic

関連する問題