2016-05-10 5 views
1

Я пытаюсь получить кэш времени до истечения срока действия для наблюдаемого, который абстрагирует «запрос-ответ», используя postMessage и message события в окне.RxJS 5 Timed Cache

Удаленное окно ожидает сообщение getItemList и отвечает на него сообщением типа {type: 'itemList', data: []}.

Я бы хотел, чтобы модель itemList$ наблюдалась таким образом, что она кэширует последний результат в течение 3 секунд, так что никаких новых запросов не было сделано за это время, однако я не могу придумать способ достижения этого в элегантный (читаемый, один наблюдаемый - без предметов) и 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, но мне интересно, если кто-нибудь может прийти к решению, без явных предметов.

Спасибо заранее!

+0

Похож на '.repeat()' прикрепленный к концу 'itemList $' делает трюк. Может ли кто-нибудь подтвердить, что это правильный подход? –

ответ

0

Я считаю, что вы ищете rxjs оператор дроссельной:

Documentation on rxjs github repo

возвращает Observable, который излучает только первый элемент, испускаемый источника наблюдаемого во время последовательных временных окон заданного продолжительность.

В принципе, если вы хотели бы подождать, пока входы не успокоится в течение определенного периода времени, прежде чем принимать меры, вы хотите дребезга.

Если вы не хотите ждать вообще, но не хотите делать более одного запроса в течение определенного времени, вам нужно будет throttle. Из вашего прецедента, я думаю, вы хотите Дроссельная заслонка