12 votes

Différence entre RxJS et IxJS ?

Quelle est la différence entre RxJS et IxJS, et quand devrais-je utiliser l'un plutôt que l'autre ?

Extrait de la documentation d'IxJS :

RxJS est idéal pour les flux de travail basés sur des événements, où les données peuvent être envoyées au rythme du producteur, tandis qu'IxJS est idéal pour les opérations d'entrée/sortie, où vous, en tant que consommateur, pouvez extraire les données lorsque vous êtes prêt.

Après avoir parcouru les documents, la seule différence majeure semble être le concept de Itérables dans IxJS y Les observables dans RxJS .

Les Iterables et les Observables s'exécutent de manière synchrone ou asynchrone, et la fonction .forEach d'IxJS est essentiellement la même que celle de RxJS. .subscribe lorsqu'elle est associée à la méthode presque identique du from fonction de créateur. La seule autre différence est la fonction .forEach est facultative car vous pouvez utiliser la méthode impérative for-of au lieu de cela.

On a l'impression qu'il y a deux bibliothèques sans raison, car la bibliothèque de RxJS from peut convertir des Iterables en Observables.

De mon point de vue, il ne s'agit pas vraiment d'IxJS et de RxJS, mais d'Iterables et d'Observables. En quoi sont-ils différents et quand utiliseriez-vous l'un plutôt que l'autre ?

18voto

Oles Savluk Points 2259

Tl;dr

RxJS traite les valeurs dès leur arrivée. C'est un pousser système.

IxJS précise quand transmettre la valeur suivante. Il s'agit d'un tirer système.

Explication

IxJS peut être utile si l'on souhaite disposer d'un modèle basé sur la traction, par exemple en cas de contre-pression.

Comme vous pouvez le voir dans la documentation :

IxJS unifie les collections synchrones et asynchrones basées sur la traction, tout comme RxJS a unifié le monde des collections basées sur la poussée. RxJS est idéal pour les flux de travail basés sur des événements où les données peuvent être poussées au rythme du producteur, tandis qu'IxJS est idéal pour les opérations d'E/S où vous, en tant que consommateur, pouvez extraire les données lorsque vous êtes prêt.

En d'autres termes :

  • Utilisation RxJS si votre producteur (généralement l'utilisateur) est plus lent que le traitement des données (ce qui est courant pour les applications frontales).
  • Utilisation IxJS si votre producteur (généralement le système) est beaucoup plus rapide que vous ne pouvez traiter les données (ce qui est plus courant pour le backend).

Pour comprendre ce que cela signifie, prenons l'exemple suivant :

Vous devez créer un pipeline ETL et traiter un fichier volumineux (environ 1 To).

Si vous l'écrivez avec RxJS, quelque chose comme :

readFileByLineObservable('path/to/file')
.pipe(
  doSomeHeavyTransformation(),
)
.subscribe()

Entonces readFileByLineObservable essaiera de "pousser" le fichier entier de 1TB dans la RAM dès que possible. Ce n'est qu'après cela que vous commencerez à faire doSomeHeavyTransformation . Ce problème est appelé contre-pression .

En revanche, IxJS essaiera de "tirer" chaque nouvelle ligne seulement après que la ligne précédente a été traitée. C'est la méthode de traitement optimale dans ce cas.

La différence réside dans la façon dont la fonction .subscribe met en place un écouteur, alors que la fonction .forEach indique à son itérateur quand donner la valeur suivante (seulement après avoir traité la première). C'est similaire, mais pas identique, à la fonction concatMap y concatAll des opérateurs.

1voto

Bogdan Biv Points 390

En complément de Oles Savluk j'ai trouvé l'explication de Matt Podwysocki particulièrement utile ( https://gist.github.com/mattpodwysocki/1d0fe43961c6222571386568b8a5ef23 ) :

nous disposons de quatre types de collections, chacune ayant sa propre finalité. Chaque a sa propre place, et il n'y a pas de solution unique qui les régisse toutes.

Pull: Iterable - purely synchronous data, either finite or infinite
Push: Observable / Subject/Observer - eventual data such as DOM events, collections over time
Pull/Push: AsyncIterable - I/O or other asynchronous data where the consumer needs to be in control
Push/Pull: AsyncObservable - Network calls where creation/teardown may be asynchronous as well as projections may be asynchronous too.

Matt contribue à la fois à RxJS et à IxJS. Iterable et AsyncIterable proviennent d'IxJS, Observable et AsyncObservable sont développés dans RxJS.


Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X