2016-05-10 13 views
1

私は窓でpostMessagemessageイベントを使用して、 "要求 - 応答"を抽象化するオブザーバブルのために時間満了キャッシュを取得しようとしています。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演算子スロットルを探していると信じて

+0

'itemList $'の最後に '.repeat()'と書いてあるように見えます。誰もがこれが正しいアプローチであることを確認できますか? –

答えて

0

Documentation on rxjs github repo

は、指定の連続する時間窓の間に観察可能 源から放出された唯一の最初の項目を放射する観察可能を返します 期間。

入力が行動を起こす前に、一定期間のために静かにするまで、あなたが待つしたい場合は、基本的に、あなたはデバウンスにしたいです。

一定の時間内に1つ以上のクエリを実行したくない場合は、スロットルが必要です。あなたのユースケースから、あなたはスロットルにしたいと思うと思います。

関連する問題