2016-05-10 9 views
1

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!

+0

Sieht aus wie '.repeat()' am Ende von 'itemList $' geheftet tut den Trick. Kann jemand bestätigen, dass dies der richtige Ansatz ist? –

Antwort

0

Ich glaube, Sie suchen den rxjs Operator Drossel:

Documentation on rxjs github repo

Gibt einen beobachtbaren, die von der Quelle beobachtbare während aufeinanderfolgenden Zeitfenstern eines bestimmten emittiert nur das erste Element emittiert Dauer.

Grundsätzlich, wenn Sie, bis die Eingänge für einen bestimmten Zeitraum vor der Einnahme Aktion gestillt haben warten möchten, wollen Sie debounce.

Wenn Sie nicht warten möchten, aber nicht mehr als eine Abfrage innerhalb einer bestimmten Zeit durchführen möchten, benötigen Sie Drossel. Von Ihrem Anwendungsfall, denke ich, dass Sie wollen Drossel