次のコードがあると想像してください。
let a = Rx.Observable.of(1, 2, 3)
let b = Observable.zip(a, a, (a, b) => a + b)
b.forEach(t => console.log(t))
これにより、結果がすぐに出力されます。さて、どのように私は、各メッセージの間に一定時間の遅延を入れて行う背圧の仕方(私はバッファを望んでいないことに注意してください。代わりに、私が欲しいa
とb
なるためにコールド観測を)のように、:
b.takeEvery(1000).forEach(t => console.log(t))
そして、まったく同じ答えがあります:
<wait 1s>
2
<wait 1s>
4
<wait 1s>
6
代替案:バックプレッシャ(一部のオブザーバブルのプルメカニズム)がRxJSでサポートされていないものである場合、リソースを使い果たすことなく無限のジェネレーターを作成するにはどうすればよいですか?
代替案2:プルメカニズムとプッシュメカニズムの両方をサポートする他のJSフレームワーク?
RxJS 5.xの場合、背圧はサポートされていませんが、たとえば4.xバージョンにはpausable
オペレーターがあります。ホットオブザーバブルでのみ機能します。4.xの場合の背圧の詳細とここ(特に下部の戦利品とRxJS関連の説明を参照してください)。
このErikMeijerのツイートは少し物議を醸すかもしれませんが、関連性があります:https://twitter.com/headinthebox/status/774635475071934464
背圧メカニズムを独自に実装するには、双方向通信チャネルが必要です。これは、両端に1つずつ、合計2つのサブジェクトでかなり簡単に作成できます。基本的next
に、メッセージの送信と.subscribe
相手側へのリストに使用します。
ジェネレーターの作成も実行可能です。ここでも、サブジェクトを使用して、プッシュベースの世界とプルベースの世界の間を橋渡しします。フィボナッチ数を生成するための例示的な実装の下。
const fib = () => {
const n = new Rx.Subject()
const f = n
.scan(c => ({ a: c.b, b: c.b + c.a }), { a: 0, b: 1 })
.map(c => c.a)
return {
$: f,
next: () => n.next()
}
}
const f = fib()
f.$.subscribe(n => document.querySelector('#r').innerHTML = n)
Rx.Observable.fromEvent(document.querySelector('#f'), 'click')
.do(f.next)
.subscribe()
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>
<button id='f'>NEXT FIBONACCI</button>
<div id='r'>_?_<div>
あなたにとって興味深いかもしれない別のjsライブラリはhttps://github.com/ubolonton/js-cspです-それを使用しなかったので、それがどのように背圧を処理するかはわかりません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加