Letzte Woche beantwortete ich eine RxJS- Frage, in der ich mit einem anderen Community-Mitglied über Folgendes diskutierte: "Soll ich für jede bestimmte Nebenwirkung ein Abonnement erstellen oder sollte ich versuchen, Abonnements im Allgemeinen zu minimieren?" Ich möchte wissen, welche Methologie im Hinblick auf einen vollständig reaktiven Anwendungsansatz zu verwenden ist oder wann von einer zur anderen gewechselt werden muss. Dies wird mir und vielleicht anderen helfen, unnötige Diskussionen zu vermeiden.
Setup-Informationen
- Alle Beispiele sind in TypeScript
- Zur besseren Fokussierung auf die Frage keine Verwendung von Lebenszyklen / Konstruktoren für Abonnements und um im Framework unabhängig zu bleiben
- Stellen Sie sich vor: Abonnements werden in Konstruktor / Lebenszyklus-Init hinzugefügt
- Stellen Sie sich vor: Das Abbestellen erfolgt im Lebenszyklus zerstören
Was ist eine Nebenwirkung (Winkelprobe)
- Update / Eingabe in der Benutzeroberfläche (zB
value$ | async
) - Output / stromaufwärts einer Komponente (z
@Output event = event$
) - Interaktion zwischen verschiedenen Diensten in verschiedenen Hierarchien
Beispielhafter Anwendungsfall:
- Zwei Funktionen:
foo: () => void; bar: (arg: any) => void
- Zwei beobachtbare Quellen:
http$: Observable<any>; click$: Observable<void>
foo
wird aufgerufen, nachdemhttp$
ausgegeben wurde und keinen Wert benötigtbar
wird nachclick$
emits aufgerufen , benötigt aber den aktuellen Wert vonhttp$
Fall: Erstellen Sie ein Abonnement für jede bestimmte Nebenwirkung
const foo$ = http$.pipe(
mapTo(void 0)
);
const bar$ = http$.pipe(
switchMap(httpValue => click$.pipe(
mapTo(httpValue)
)
);
foo$.subscribe(foo);
bar$.subscribe(bar);
Fall: Abonnements im Allgemeinen minimieren
http$.pipe(
tap(() => foo()),
switchMap(httpValue => click$.pipe(
mapTo(httpValue )
)
).subscribe(bar);
Meine eigene Meinung kurz
Ich kann die Tatsache verstehen, dass Abonnements Rx-Landschaften zunächst komplexer machen, weil Sie sich überlegen müssen, wie Abonnenten die Pipe beeinflussen sollen oder nicht (teilen Sie Ihre beobachtbaren oder nicht). Aber je mehr Sie Ihren Code trennen (je mehr Sie sich konzentrieren: Was passiert wann), desto einfacher ist es, Ihren Code in Zukunft zu warten (zu testen, zu debuggen, zu aktualisieren). In diesem Sinne erstelle ich immer eine einzige beobachtbare Quelle und ein einziges Abonnement für alle Nebenwirkungen in meinem Code. Wenn zwei oder mehr Nebenwirkungen, die ich habe, durch genau dieselbe beobachtbare Quelle ausgelöst werden, teile ich meine beobachtbaren und teile jede Nebenwirkung einzeln, da sie unterschiedliche Lebenszyklen haben kann.