Mein Szenario ist eine klassische Webseite mit einem Suchformular und einer Ergebnisliste. Ich möchte das Verhalten des Ladens der Ergebnisse in ein Observable einkapseln.RxJs: Muster für beobachtbare Suchergebnisse
Hier ist, was ich zur Zeit in Typoskript tun:
function loadResults(query): Observable<T[]> {}
const results = new Subject<ResultEvent<T[]>>();
const results: Observable<ResultEvent<T[]>> =
form.valueChanges
.distinctUntilChanged()
.do(() => results.next(ResultEvent.pending()))
.switchMap(query => loadResults(query))
.subscribe({
next: (data: T[]) => results.next(ResultEvent.present(data)),
error: err => results.next(ResultEvent.failed(err)),
});
Die Idee ist, dass results
immer den aktuellen Stand der Suche enthält: entweder pending
, present
oder failed
. Wenn sich die Abfrage ändert, wird das Ergebnis auf pending
festgelegt, und wenn der Dienst Daten zurückgibt, wird das Ergebnis auf present
festgelegt.
Was mir an dieser Lösung nicht gefällt, ist der explizite Aufruf an subscribe()
. Ich hätte lieber eine einfache Observable
, die abonniert werden kann (zB in Angular mit der async
Pipe), ohne eine explizite Anmeldung zu erstellen. Die Nebenwirkungen in do
erscheinen auch ziemlich hacky.
const results: Obserbable<ResultEvent<T[]>> =
form.valueChanges.distinctUntilChanged()
. /* here be dragons */;
Vielen Dank für jede Beratung und Ideen!
Schöne, vielen Dank. Sieht auf diese Weise viel hübscher aus. Und ein guter Punkt über die Entprellung, ich habe es absichtlich weggelassen, um das Beispiel einfach zu halten. –
@PhilippJardas Wenn es Ihre Frage beantwortet hat, betrachten Sie es bitte als akzeptiert. :-) –
Sicher Sache. :-) –