Tipp: Nur verwenden, first()
wenn:
- Sie betrachten null ausgegebene Elemente als Fehlerbedingung (z. B. Abschluss vor dem Senden) UND wenn die Fehlerwahrscheinlichkeit größer als 0% ist, behandeln Sie sie ordnungsgemäß
- ODER Sie wissen zu 100%, dass die beobachtbare Quelle mehr als 1 Elemente ausgibt (kann also niemals werfen) .
Wenn es keine Emissionen gibt und Sie nicht explizit damit umgehen (mit catchError
), wird sich dieser Fehler ausbreiten, möglicherweise ein unerwartetes Problem an einer anderen Stelle verursachen und es kann ziemlich schwierig sein, ihn aufzuspüren - insbesondere, wenn er von einem Endbenutzer stammt.
Sie sind größtenteils sicherer , take(1)
vorausgesetzt, dass:
- Sie können
take(1)
nichts aussenden, wenn die Quelle ohne Emission abgeschlossen ist.
- Sie müssen kein Inline-Prädikat verwenden (z. B.
first(x => x > 10)
)
Hinweis: Sie können ein Prädikat take(1)
wie folgt verwenden : .pipe( filter(x => x > 10), take(1) )
. Dies ist kein Fehler, wenn nichts größer als 10 ist.
Wie wäre es mit single()
Wenn Sie noch strenger sein und zwei Emissionen nicht zulassen möchten, können Sie single()
welche Fehler verwenden, wenn es keine oder mehr Emissionen gibt . Auch in diesem Fall müssten Sie Fehler behandeln.
Tipp: Single
Kann gelegentlich nützlich sein, wenn Sie sicherstellen möchten, dass Ihre beobachtbare Kette keine zusätzliche Arbeit leistet, z. B. zweimal einen http-Dienst aufruft und zwei beobachtbare Elemente ausgibt. Wenn Sie single
am Ende des Rohrs hinzufügen, werden Sie informiert, wenn Sie einen solchen Fehler gemacht haben. Ich verwende es in einem 'Task Runner', in dem Sie eine beobachtbare Aufgabe übergeben, die nur einen Wert ausgeben sollte. Daher leite ich die Antwort weiter single(), catchError()
, um ein gutes Verhalten zu gewährleisten.
Warum nicht immer first()
statt verwenden take(1)
?
aka. Wie kann first
möglicherweise mehr Fehler verursachen?
Wenn Sie ein Observable haben, das etwas von einem Service nimmt und es dann durchleitet, sollte es first()
Ihnen die meiste Zeit gut gehen. Aber wenn jemand kommt , den Service für welchen Gründen auch immer zu deaktivieren - und ändert es emittieren of(null)
oder NEVER
dann alle nachgelagerten first()
Betreiber beginnen würde , Fehler zu werfen.
Jetzt ist mir klar, dass dies genau das sein könnte , was Sie wollen - daher ist dies nur ein Tipp. Der Betreiber hat first
mich angesprochen, weil es etwas weniger "ungeschickt" klang als, take(1)
aber Sie müssen vorsichtig mit Fehlern umgehen, wenn jemals die Möglichkeit besteht, dass die Quelle nicht emittiert. Wird ganz davon abhängen, was Sie tun.
Wenn Sie einen Standardwert (Konstante) haben:
Überlegen Sie auch, .pipe(defaultIfEmpty(42), first())
ob Sie einen Standardwert haben, der verwendet werden soll, wenn nichts ausgegeben wird. Dies würde natürlich keinen Fehler auslösen, da first
immer ein Wert erhalten würde.
Beachten Sie, dass dies defaultIfEmpty
nur ausgelöst wird, wenn der Stream leer ist, nicht wenn der Wert der ausgegebenen Daten ist null
.
first()
undtake()
bin im Allgemeinen gleich, was ich für offensichtlich halte, nur dasfirst()
undtake(1)
sind gleich. Ich bin mir anhand Ihrer Antwort nicht sicher, ob Sie glauben, dass es noch einen Unterschied gibt?