2016-05-10 36 views
1

我試圖讓時間到期高速緩存工作於一個可觀察到的「請求 - 響應」,在窗口上使用postMessagemessage事件。RxJS 5定時高速緩存

遠程窗口需要消息getItemList並用類型爲{type: 'itemList', data: []}的消息對其進行答覆。

我想建模itemList$可觀察到的方式,它將最後一個結果緩存3秒,以便在那段時間內不會有新的請求,但是,我想不出有什麼方法可以實現優雅(閱讀,一個可觀察的 - 沒有主題)和緩和的方式。

這裏是代碼的例子:

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,但我想知道如果有人能拿出沒有明確的主題的解決方案。

預先感謝您!

+0

看起來''.repeat()'添加到'itemList $'的末尾就是一個竅門。任何人都可以證實這是正確的做法嗎? –

回答

0

我相信你正在尋找rxjs操作油門

Documentation on rxjs github repo

返回一個可觀察的是在指定的連續時間窗口發出只能由 源可觀察到發射的第一項 持續時間。

基本上,如果你想等到輸入已經平息了的一段時間採取行動之前,要

如果您不想等待,但不希望在特定的時間內進行超過1次的查詢,則您會想要節流閥。從你的使用案例來看,我認爲你想要節流閥