2017-02-06 7 views
2

Ist es möglich, einen debounceTime-Wert auf etwas zu setzen, das sich aufgrund einer Bedingung ändert? Ich habe ein Setup-Verhalten Subjekt als so (und bitte sagen Sie mir, wenn ich auch diesen Teil falsch zu machen):Variable debounceTime basierend auf Bedingungen

this.searchSubject.asObservable().debounceTime(1000).subscribe(x => this.emitFilters()) 

ich die Entprellzeit, anders zu sein, basierend auf bestimmte Filterbedingungen mag, aber wenn ich versuchen Sie, eine Funktion dort hinein zu werfen, beschwert sich VS Code, dass es nicht gültig ist.

Ich schaute auch auf Debounce, die eine Art Variable zu nehmen scheint, aber aus der Dokumentation kann ich nicht scheinen, es herauszufinden (die Funktion, die ich warf in den falschen Typ nach VS Code zurückgegeben, obwohl ich aus dokumentiertem Code kopiert habe). Ich mache das alles in Angular 2, wenn es einen Unterschied macht.

Antwort

2

Wo haben Sie Dokumentation gesehen, die andeutete, dass .debounceTime eine Funktion akzeptieren würde? Es ist gut here mit der folgenden Signatur dokumentiert:

public debounceTime(dueTime: number, scheduler: Scheduler): Observable 

Die Methode, die Sie für ist debounce suchen sind, die laut der Dokumentation:

Emits a value from the source Observable only after a particular time span determined by another Observable has passed without another source emission. 
It's like debounceTime, but the time span of emission silence is determined by a second Observable. 

Hier ist es Unterschrift:

public debounce(durationSelector: function(value: T): Observable | Promise): Observable 

Alles, was Sie tun müssen, um das gewünschte Verhalten zu erreichen, ist ein anderes Observable einzurichten, das das Intervall für die Entbündelung liefert e.

Sie könnten dies mit einem anderen Subject tun, das Sie entsprechend der Anwendungslogik .next() aufrufen können, um die neue Wartezeit bereitzustellen.

let debounceSubject = new Subject<number>(); 
let debounceObservable$ = debounceSubject.asObservable(); 

// Somewhere else in code you'll do debounceSubject.next(1000); for example 

Und schließlich würden Sie Ihren neuen debounce wie folgt aufgebaut:

this.searchSubject.asObservable() 
    .debounce(() => debounceObservable$).subscribe(x => this.emitFilters()) 

Weitere Beispiele für die Verwendung .debounce können here (große Website für das Lernen rxjs) einschließlich Arbeitsbeispiele mit jsBin und jsFiddle finden .

+0

Danke für die Rückmeldung. Ich habe mir die Dokumente zum Entprellen angesehen, aber wie du schon sagtest, benutzt es Observables. Wenn ich es nicht vollständig sehe (was wahrscheinlich der mentalen Verschiebung der Observablen entspricht), tut es nicht wirklich, was ich will, aber dank dieser Dokumentation sieht takeLast -> reduce -> filter aus, wenn ich kann herausfinden, wie man reduziert ... – RhoVisions

+0

Ich beschloss, unsere Ihre Lösung zu versuchen, um zu lernen, wenn nichts anderes, aber ich kann es nicht zur Arbeit bekommen. Es entprellt nicht, obwohl ich es das erforderliche Subjekt beobachtbar übergebe und ihm neue Werte entsprechend übergebe. Irgendwie hat es auch anderen Code kaputt gemacht, also vermute ich, dass meine allgemeine Verwendung/Struktur falsch ist:/Danke fürs Aushelfen. – RhoVisions

+0

Wenn Sie eine vollständigere Codebeispiel für wo Sie jetzt sind, oder noch besser einen Plunker oder etwas geben kann ich einen Blick und versuchen zu helfen –

Verwandte Themen