Ich versuche, Zeit Ablauf Cache für eine Observable, die abstrahiert eine "Anfrage-Antwort", mit postMessage
und message
Ereignisse im Fenster zu arbeiten.RxJS 5 Zeitgesteuerter Cache
Das Remote-Fenster erwartet eine Nachricht getItemList
und antwortet darauf mit einer Nachricht vom Typ {type: 'itemList', data: []}
.
Ich möchte die itemList$
Observable so modellieren, dass sie das letzte Ergebnis für 3 Sekunden speichert, so dass während dieser Zeit keine neuen Anfragen gemacht werden, aber ich kann mir keinen Weg vorstellen, dies in einem zu erreichen elegant (lesen, eine beobachtbare - keine Themen) und Succint Art. Hier
ist das Beispiel in Code:
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);
Ich bin mir dessen bewusst the (very similar) question, aber ich frage mich, ob jemand mit einer Lösung ohne explizite Themen kommen können.
Vielen Dank im Voraus!
Sieht aus wie '.repeat()' am Ende von 'itemList $' geheftet tut den Trick. Kann jemand bestätigen, dass dies der richtige Ansatz ist? –