クリック数を動的にリッスンするボタンが2つあります。 listeningArray$
は、リッスンする必要のあるボタン#の配列(ar
)を送出します。誰かが私が聞いているこれらのボタンをクリックすると、クリックされたボタンをログに記録し、時間間隔から値をログに記録する必要があります。switchMap内の動的配列のCombineLatestは定期的にサブスクライブしています。
ar
が[1,2]
から[1]
になる場合、ボタン#2のクリックをリッスンする必要があります。したがって、DOMクリックイベントは2
のために削除する必要があり、それは.finally()
演算子をトリガーするはずです。しかし、1
の場合は、登録したままにして、.finally()
のコードを実行しないでください。何も登録が解除されていないためです。
const obj$ = {};
Rx.Observable.combineLatest(
Rx.Observable.interval(2000),
listeningArray$ // Will randomly emit either [1] or [1,2]
)
.switchMap(([x, ar]) => {
const observables = [];
ar.forEach(n => {
let nEl = document.getElementById('el'+n);
obj$[n] = obj$[n] || Rx.Observable.fromEvent(nEl, 'click')
.map(()=>{
console.log(' el' + n);
})
.finally(() => {
console.log(' FINALLY_' + n);
});
observables.push(obj$[n]);
})
return Rx.Observable.combineLatest(...observables);
})
.subscribe()
は、しかし、間隔が値を発するたびは何が起こっているのか、DOMイベントすべて削除を取得し、すぐに再び追加されます、そして.finally演算子内のコードは1
と2
のために実行されます。
これは本当にイライラしています。私は何が欠けていますか?
それは複雑な状況のビットですので、私はこれを作成しました:FRPでhttps://jsfiddle.net/mfp22/xtca98vx/7/
あなたが探している動作をより詳しく説明してください。 –
@MarkvanStratenチップをありがとう。私は私の質問を再構成しました。うまくいけばそれはより明確です。 –