2016-06-01 8 views
0

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.

Antwort

0

Ich bin mir nicht sicher, genau erfasst zu haben, welche der folgenden Sie suchen, also werde ich beide einfach beschreiben. Es gibt zwei "zeitbasierte Muster", die am häufigsten für diese Art von Problem geeignet in meiner Erfahrung:

  • debounce

rxmarbles url: http://rxmarbles.com/#debounce; github doc

Wie sagt es in seiner Dokumentation, es

ein Element aus der Quelle nach einer bestimmten Zeitspanne beobachtbare Strahlt ohne die beobachtbaren Weglassen andere Gegenstände bestanden hat.

  • Drossel

rxmarbles url: noch keiner; github doc

Gibt einen beobachtbaren, die von der Quelle beobachtbare während sequenzieller Zeitfenster von einer bestimmten Dauer emittiert nur das erste Element emittiert.

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, möchten Sie Drossel.

Ich hoffe, es macht Sinn.

+0

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