私は窓でpostMessage
とmessage
イベントを使用して、 "要求 - 応答"を抽象化するオブザーバブルのために時間満了キャッシュを取得しようとしています。RxJS 5時間キャッシュ
リモートウィンドウでは、メッセージgetItemList
が必要で、メッセージには{type: 'itemList', data: []}
というメッセージが返されます。
私はを観測可能にモデル化して、最後の結果を3秒間キャッシュするようにしたいので、その間に新しい要求は行われませんが、私はそれを達成する方法は考えられませんエレガント(読んで、1つの観察可能な - 被験者なし)とsuccintの方法。ここで
はコードの例です:
const remote = someIframe.contentWindow;
const getPayload = message => message.data;
const ofType = type => message => message.type === type;
// all messages coming in from the remote iframe
const messages$ = Observable.fromEvent(window, 'message')
.map(getPayload)
.map(JSON.parse);
// the observable of (cached) items
const itemList$ = Observable.defer(() => {
console.log('sending request');
// sending a request here, should happen once every 3 seconds at most
remote.postMessage('getItemList');
// listening to remote messages with the type `itemList`
return messages$
.filter(ofType('itemList'))
.map(getPayload);
})
.cache(1, 3000);
/**
* Always returns a promise of the list of items
* @returns {Promise<T>}
*/
function getItemList() {
return itemList$
.first()
.toPromise();
}
// poll every second
setInterval(() => {
getItemList()
.then(response => console.log('got response', response));
}, 1000);
私はthe (very similar) questionを認識していますが、誰もが明確な主題なしで解決策を考え出すことができる場合、私は疑問に思って。
ありがとうございます!私はあなたがrxjs演算子スロットルを探していると信じて
'itemList $'の最後に '.repeat()'と書いてあるように見えます。誰もがこれが正しいアプローチであることを確認できますか? –