警告:ここにRxJS newbがあります。ここでRxJS:複数のネストされたオブザーバをバッファと組み合わせる方法
は私の課題です:
onUnlink$
観測可能発する...- は、すぐに(私はこのパーティション
onAddBuffer$
と呼ぶことにします)1秒の最大のために、観測可能onAdd$
から値をキャプチャを開始すると。 onAddBuffer$
に観察試合doc$
値からの値のいずれかが、我々はonAdd$
値のいずれかにマッチするために使用しますモデルをフェッチするクエリ(観測可能doc$
を作成する)データベース、 を放出しないでください
- 観測可能
onAddBuffer$
からの値はいずれもdoc$
値と一致していない、または、観察発することはありませんonAddBuffer$
場合、これは私の最高の推測だった
doc$
値に放出した場合:
// for starters, concatMap doesn't seem right -- I want a whole new stream
const docsToRemove$ = onUnlink$.concatMap(unlinkValue => {
const doc$ = Rx.Observable.fromPromise(db.File.findOne({ unlinkValue }))
const onAddBuffer$ = onAdd$
.buffer(doc$) // capture events while fetching from db -- not sure about this
.takeUntil(Rx.Observable.timer(1000));
// if there is a match, emit nothing. otherwise wait 1 second and emit doc
return doc$.switchMap(doc =>
Rx.Observable.race(
onAddBuffer$.single(added => doc.attr === added.attr).mapTo(Rx.Observable.empty()),
Rx.Observable.timer(1000).mapTo(doc)
)
);
});
docsToRemove$.subscribe(doc => {
// should only ever be invoked (with doc -- the doc$ value) 1 second
// after `onUnlink$` emits, when there are no matching `onAdd$`
// values within that 1 second window.
})
これは、常にEmptyObservable
を発します。たぶんそれはsingle
は一致がない場合undefined
を放出するように見えるので、一致がないときは全く発光しないと思っていますか? find
でも同じことが起こります。
single
をfilter
に変更すると、何も出力されません。
FYI:これはファイルシステムイベントと名前変更シナリオがある - add
イベントがunlink
イベントの1秒以内に次の放出されたファイルは、試合をハッシュし、それはrename
だから何もしない場合。そうでない場合は、それは真のunlink
であり、削除されるべきデータベースdocを放出するはずです。
あなたはここでかなり厄介な競争状態を構築しているようですね。タイムアウトは通常これに対処する良い方法ではありません。何らかの理由で何かが長くかかると、データが失われます。 –
はいここに競争条件がある可能性は間違いありません。最終的にはこのアプローチを打破するかもしれない。rxjsを学ぶ良い機会のように思えました。 – glortho