Я пытаюсь получить кэш времени до истечения срока действия для наблюдаемого, который абстрагирует «запрос-ответ», используя 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, но мне интересно, если кто-нибудь может прийти к решению, без явных предметов.
Спасибо заранее!
Похож на '.repeat()' прикрепленный к концу 'itemList $' делает трюк. Может ли кто-нибудь подтвердить, что это правильный подход? –