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
?
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.
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.
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.