web-dev-qa-db-fra.com

Différence entre .insouscrire à .take (1)

Je me demande s’il existe une différence de performances entre l’utilisation de .take(1) et de .unsubscribe lorsque unsubscribe est utilisé juste après la souscription:

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

Première:

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

Seconde:

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

Avez-vous des idées différentes sur la performance?

45
TheUnreal

Chacun sert un objectif différent, il est donc difficile de les comparer.

En général si vous prenez cette source:

const source = range(1,3);

... et le consomme avec subscribe() suivi immédiatement de unsubscribe():

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

... alors toutes les valeurs de source seront émises même si nous avons appelé unsubscribe() juste après votre inscription. En effet, le code est toujours strictement séquentiel (synchrone) et le source est un observable à froid.

1
2
3
complete

Btw, essayez d'ajouter delay(0) opérateur pour rendre source.pipe(delay(0)).subscribe(...).unsubscribe(). Cela rend l’émission de valeurs asynchrone à l’aide d’un appel setTimeout() réel; pour cette raison, unsubscribe() est appelé avant tout gestionnaire next et est immédiatement ignoré.

En d'autres termes, unsubscribe() vous permet de ne plus recevoir de valeurs à tout moment. Même lorsque la source n’a émis aucune valeur (nous ne recevons jamais de notification complète).

L'utilisation de l'opérateur take() limite la chaîne à n'émettre qu'un nombre spécifique de valeurs.

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

Cela n'émet qu'une seule valeur et complète:

1
complete

Même si vous ajoutez .unsubscribe(), le résultat sera le même.

Voir la démo en direct: https://stackblitz.com/edit/rxjs-tbu5kb

Donc, take() est un opérateur alors que unsubscribe() est une méthode sur un objet Subscription . Ces deux choses sont souvent interchangeables mais ne se substituent jamais complètement.

Jan 2019: Mise à jour pour RxJS 6

85
martin

Gardez juste à l’esprit que prendre (1) ne se désinscrit toujours pas lorsque le composant est en cours de destruction. L'abonnement reste actif jusqu'à ce que la première valeur soit émise, que le composant soit actif ou détruit. Donc, si nous faisons quelque chose de plus fou, comme accéder au DOM, dans notre abonnement, nous pourrions nous retrouver avec une erreur dans la console. https://blog.angularindepth.com/the-best-way-tunsunsubscribe-rxjs-observable-in-the-angular-applications-d8f9aa42f6a

8
el peregrino