web-dev-qa-db-fra.com

Comment obtenir la valeur "actuelle" d'un observateur au moment de la souscription

J'ai du mal à grogner une partie particulière de RxJs: lorsque vous vous abonnez à un observable, vous ne vous abonnez qu'à des événements futurs de ce flux. Comparer aux promesses, où, si la promesse a été résolue, vous obtiendrez cette valeur, peu importe lorsque vous appelez then().

Voici un exemple de code:

var subject = new Rx.Subject();

subject.onNext('old value');
subject.onNext('before subscription');

subject.subscribe(function(val) {
  document.write(val);
});

subject.onNext('after subscription');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/2.3.24/rx.all.js"></script>

Je m'attendrais à voir à la fois "avant abonnement" et "après abonnement" imprimés, bien qu'il soit logique pour moi que "l'ancienne valeur" soit supprimée. Mais il semble que RxJs ne fonctionne pas de cette façon (seulement "après abonnement" est imprimé). Comment puis-je obtenir le résultat que je recherche?

48
DallonF

Rx propose les deux comportements (ainsi que d'autres).

Les différents sujets Rx disponibles peuvent vous permettre d'explorer les différentes manières dont les observables peuvent se comporter:

  • le Rx.Subject est la variété la plus élémentaire du feu et de l'oubli - si vous n'étiez pas abonné lorsque l'événement s'est produit, alors vous ne le voyez pas.

  • Utilisez new Rx.BehaviorSubject(undefined) au lieu de Subject et vous obtenez le comportement que vous cherchiez, car un BehaviorSubject représente une "valeur qui peut changer"

  • Utilisez new Rx.ReplaySubject(5) et vous obtiendrez les 5 valeurs les plus récentes dès votre inscription

  • Utilisez new Rx.AsyncSubject() et vous n'obtiendrez rien jusqu'à ce que l'observable se termine , moment auquel vous obtiendrez la valeur finale (et continuez à obtenir le valeur finale si vous vous réinscrivez). C'est le véritable analogue Rx de Promises, car il ne produit rien jusqu'à ce qu'il "résout" (c'est-à-dire se termine), et donne ensuite toujours la valeur à toute personne qui s'abonne.

82
Brandon