web-dev-qa-db-fra.com

Quand dois-je utiliser `publishReplay` vs` shareReplay`?

Je le sais déjà

  • publish partage un seul abonnement et renvoie également un ConnectableObservable (nous devons donc Connect())

  • Share() est publish().refcount()

Le suffixe Replay est assez évident, il renvoie sa dernière émission/s.

Prenons par exemple une Angular http avec abonnement présent ET futur:

<p>{{ (person | async)?.id   }}</p> //present markup

<p *ngIf=”show”>{{ (person | async)?.userId }}</p> //future markup

Si je ne veux pas de plusieurs demandes http je peux utiliser:

publishReplay().Connect()

Mais je peux aussi utiliser: shareReplay(), mais je suis sûr qu'il y en a un ici plus correct à utiliser que l'autre.

Question:

Quand dois-je utiliser publishReplay vs shareReplay? Quelle sera la différence par rapport à cette demande future présente sur le HTTP?

NB Pourquoi il n'y a pas de documentation sur shareReplay?

23
Royi Namir

publishReplay vous permet de contrôler le début de l'abonnement. shareReplay démarrera automatiquement lors du premier abonnement.

Généralement, si l'observable doit être utilisé dans un modèle (fichier html), utilisez shareReplay. L'avantage étant que vous n'aurez pas à vous soucier de la désinscription, etc.

12
Joe King

shareReplay () est fondamentalement publishReplay (). refCount ()

Certainement pas.

shareReplay et publishReplay (+ appeler connect dessus) rendra l'observable derrière lui très chaud.

Mais la la différence très importante entre eux est:

  • shareReplay: ne s'arrêtera pas émettant jusqu'à ce qu'il soit terminé, peu importe qu'il n'y ait plus d'abonnement ou non.
  • publishReplay: s'arrêtera après que le dernier abonné se désabonne s'il est utilisé avec refCount

À mon humble avis, il s'agit d'une information cruciale.

19
DevRok

shareReplay() est essentiellement publishReplay().refCount()

Voici un excellent article expliquant cela en détail: "Pipes asynchrones angulaires - Méfiez-vous du partage"

Modifier:

La bonne chose à dire est:

shareReplay() est similaire à publishReplay().refCount()

voir @ réponse de DevRok pour plus d'informations pourquoi ils ne sont pas exactement les mêmes.

3
nyxz