Angenommen wir eine Funktion GetIDs haben(), die eine Reihe von einigen ids wie dies geschieht:Halten Verzögerung HTTP-Anforderung, bis neue params ankommen
getIds([4, 1, 32]);
Diese Funktion HTTP-Aufruf für 100 ms verzögern. Aber während 100ms wenn diese gleiche Funktion erneut aufgerufen:
getIds([1, 8, 5]);
Es wird den 100 ms-Timer zurückgesetzt und hält die übergebenen ids verschmelzen. Es wird senden HTTP-Anfrage nur, wenn es von niemandem mehr als 100ms aufgerufen wird.
Ich bin neu bei RxJS und hier ist mein Versuch, dieses Problem zu lösen, aber ich habe ein Gefühl, dass es bessere Lösung für dieses Problem geben könnte.
https://jsfiddle.net/iFadey/v3v3L0yd/2/
function getIds(ids) {
let observable = getIds._observable,
subject = getIds._subject;
if (!observable) {
subject = getIds._subject = new Rx.ReplaySubject();
observable = getIds._observable = subject
.distinct()
.reduce((arr, id) => {
arr.push(id);
return arr;
}, [])
// Some HTTP GET request will go here
// whose results may get flatMapped here
.publish()
.refCount()
;
}
ids.forEach((id) => {
console.log(id);
subject.next(id);
});
clearTimeout(getIds._timer);
getIds._timer = setTimeout(() => {
getIds._observable = null;
getIds._subject = null;
subject.complete();
}, 100);
return observable;
}
getIds([1, 2, 3])
.subscribe((ids) => {
console.log(ids);
});
getIds([3, 4, 5])
.subscribe((ids) => {
console.log(ids);
});
edit: ich für einen Betreiber suchen, die wie debounce verhält sich aber ohne vorherige Werte fallen. Stattdessen muss es sie in die Warteschlange stellen.
Danke für die Antwort, aber ich suchte nicht nach diesen Operatoren. Ich brauche einen Operator, der sich genau wie Debounce verhält, ohne die vorherigen Werte zu verlieren. Stattdessen muss es sie in die Warteschlange stellen. Ich denke meine Frage ist etwas vage. Lass mich es bearbeiten. – ifadey