2016-11-12 25 views
7

Ich frage mich, ob es einen Unterschied in der Leistung zwischen der Verwendung von .take(1) und .unsubscribe wenn unsubscribe direkt nach dem Abonnement verwendet wird:Unterschied zwischen .unsubscribe .take (1)

var observable = Rx.Observable.interval(100); 

Erstens:

var subscription = observable.subscribe(function(value) { 
    console.log(value); 
}).unsubscribe(); 

Zweitens:

var subscription = observable.take(1).subscribe(function(value) { 
     console.log(value); 
    }); 

Irgendwelche Ideen davon hat die Leistung etwas anderes zu beachten?

+0

'var subscription = observable.subscribe ({Funktion A}). Unsubscribe();' funktioniert nicht wie erwartet incase funcation A wird aufgerufen, nachdem javascrit diese Zeile beendet hat. Anstatt nur einen Wert zu erhalten, erhalten Sie null Werte. Es wird empfohlen, sich manuell anzumelden und take (..) oder andere Methoden zu verwenden, wie zum Beispiel das Abonnement für Sie. –

Antwort

21

Jedes dient einem anderen Zweck, so dass es schwierig ist, sie zu vergleichen.

Im Allgemeinen, wenn Sie diese Quelle nehmen:

let source = Observable.range(1,3); 

und verbrauchen sie mit subscribe() unmittelbar gefolgt von unsubscribe():

source.subscribe(
    val => console.log(val), 
    undefined, 
() => console.log('complete') 
).unsubscribe(); 

Dann werden alle Werte aus der Quelle, obwohl ich zu emittierenden gehen direkt nach dem Abonnieren aufgerufen. Dies liegt daran, dass der Code immer noch streng sequenziell ist und die source ist eine kalte Observable.

1 
2 
3 
complete 

Btw, versuchen .delay(0) Operator Hinzufügen source.delay(0).subscribe(...).unsubscribe() und sehen zu machen, was passiert. Dies bewirkt, dass Werte für die Rückrufe der Teilnehmer asynchron unter Verwendung eines tatsächlichen setTimout() Aufrufs gesendet werden, und aus diesem Grund wird unsubscribe() aufgerufen, bevor es die Rückrufe erreicht, und wird sofort verworfen, da wir uns bereits abgemeldet haben.

Mit anderen Worten: unsubscribe() können Sie jederzeit Werte empfangen. Auch wenn die Quelle nicht alle Werte ausgegeben hat (wir erhalten nie einen vollständigen Aufruf).

Der Operator take() beschränkt die Kette so, dass nur eine bestimmte Anzahl von Werten ausgegeben wird.

source.take(1).subscribe(
    val => console.log(val), 
    undefined, 
() => console.log('complete') 
); 

Dieser sendet nur einen einzigen Wert und ergänzt:

1 
complete 

Auch wenn Sie .unsubscribe() hinzugefügt das Ergebnis wäre das gleiche.

Siehe Live-Demo: https://jsbin.com/copujo/4/edit?js,console

So take() ist ein Operator Verkettungs Observable während unsubscribe() ein Verfahren auf Subscription Objekt ist. Diese zwei Dinge sind oft austauschbar, aber ich denke, sie ersetzen sich nie vollständig.

+2

hi @martin nimmt (1) abmelden? Wenn ich Take (1) hinzufüge, muss ich mich erneut abmelden?Danke – fifth

+4

@fifth Nein, du nicht. Wenn die Kette abgeschlossen ist, ruft sie rekursiv alle Dispo-Handler auf, so dass Sie sich nicht selbst abmelden müssen. – martin

+1

danke für die Aufklärung, hat mir sehr geholfen – fifth

Verwandte Themen