Jedes dient einem anderen Zweck, daher ist es schwierig, sie zu vergleichen.
Im Allgemeinen, wenn Sie diese Quelle nehmen:
const source = range(1,3);
... und konsumiere es mit subscribe()
gefolgt von unsubscribe()
:
source.subscribe(
console.log,
undefined,
() => console.log('complete')
).unsubscribe();
... dann werden alle Werte von source
ausgegeben, obwohl wir unsubscribe()
direkt nach dem Abonnieren angerufen haben . Dies liegt daran, dass der Code immer noch streng sequentiell (synchron) ist und source
ein kaltes Observable ist.
1
2
3
complete
Übrigens, versuchen Sie, einen delay(0)
Operator hinzuzufügen source.pipe(delay(0)).subscribe(...).unsubscribe()
. Dies macht das Ausgeben von Werten unter Verwendung eines tatsächlichen setTimeout()
Aufrufs asynchron und wird aus diesem Grund unsubscribe()
vor allen next
Handlern aufgerufen und sofort verworfen.
Mit anderen Worten unsubscribe()
, Sie können jederzeit aufhören, Werte zu empfangen. Auch wenn die Quelle keinen Wert ausgegeben hat (wir erhalten nie eine vollständige Benachrichtigung).
Die Verwendung des take()
Operators beschränkt die Kette darauf, nur eine bestimmte Anzahl von Werten auszugeben.
source.pipe(
take(1),
)
.subscribe(
console.log,
undefined,
() => console.log('complete')
);
Dies gibt nur einen einzigen Wert aus und vervollständigt:
1
complete
Selbst wenn Sie .unsubscribe()
das Ergebnis hinzufügen, wäre es das gleiche.
Siehe Live-Demo: https://stackblitz.com/edit/rxjs-tbu5kb
Dies take()
gilt auch für einen Operator, während unsubscribe()
es sich um eine Methode für ein Subscription
Objekt handelt. Diese beiden Dinge sind oft austauschbar, aber sie ersetzen sich nie vollständig.
Jan 2019: Aktualisiert für RxJS 6
var subscription = observable.subscribe({function A}).unsubscribe();
funktioniert nicht wie erwartet, falls Funktion A aufgerufen wird, nachdem Javascrit diese Zeile beendet hat. Wenn Sie also nur einen Wert erhalten, erhalten Sie null Werte. Es wird empfohlen, manuell zu abonnieren und take (..) oder andere Methoden wie take zu verwenden, die sich mit dem Abonnement für Sie befassen.