Ich frage mich, ob es einen Unterschied in der Leistung zwischen der Verwendung ist .take(1)
und .unsubscribe
wenn unsubscribe
wird direkt nach dem Abonnement verwendet:
var observable = Rx.Observable.interval(100);
Zuerst:
var subscription = observable.subscribe(function(value) {
console.log(value);
}).unsubscribe();
Zweite:
var subscription = observable.take(1).subscribe(function(value) {
console.log(value);
});
Irgendwelche Ideen dazu machen die Leistung anders?
rxjs
observable
rxjs5
TheUnreal
quelle
quelle
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.Antworten:
Jedes dient einem anderen Zweck, daher ist es schwierig, sie zu vergleichen.
Im Allgemeinen, wenn Sie diese Quelle nehmen:
... und konsumiere es mit
subscribe()
gefolgt vonunsubscribe()
:... dann werden alle Werte von
source
ausgegeben, obwohl wirunsubscribe()
direkt nach dem Abonnieren angerufen haben . Dies liegt daran, dass der Code immer noch streng sequentiell (synchron) ist undsource
ein kaltes Observable ist.Übrigens, versuchen Sie, einen
delay(0)
Operator hinzuzufügensource.pipe(delay(0)).subscribe(...).unsubscribe()
. Dies macht das Ausgeben von Werten unter Verwendung eines tatsächlichensetTimeout()
Aufrufs asynchron und wird aus diesem Grundunsubscribe()
vor allennext
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.Dies gibt nur einen einzigen Wert aus und vervollständigt:
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ährendunsubscribe()
es sich um eine Methode für einSubscription
Objekt handelt. Diese beiden Dinge sind oft austauschbar, aber sie ersetzen sich nie vollständig.Jan 2019: Aktualisiert für RxJS 6
quelle
unsubscribe
selbst anrufen müssen .quelle