6
votes

RXJS: producteur-consommateur avec avortement

J'ai un problème de consommateur de producteur spécial dans RXJS: le producteur produit lentement des éléments. Un consommateur demande des éléments et doit souvent attendre le producteur. Cela peut être réalisé en zipping le producteur et le flux de demande: xxx

Parfois, une demande est abandonnée. Un élément produit ne doit être consommé qu'après une requête non annulée: xxx

la première demande R1 consumerait le premier élément produit p1 , mais R1 est abandonné par A (R1) avant de pouvoir consommer p1 . p1 est produit et est consommé c (p1, r2) sur la deuxième demande r2 . Le deuxième abort A (?) est ignoré, car aucune demande sans réponse n'est arrivée auparavant. La troisième demande R3 doit attendre sur l'élément produit suivant p2 et n'est pas abandonné jusqu'à ce que p2 est produit. Ainsi, p2 est consommé C (p2, r3) immédiatement après sa production.

Comment puis-je atteindre cela dans RXJS?

EDIT: J'ai créé un exemple avec un test Qunit sur JSBIN. Vous pouvez modifier la fonction CreateConsume (Produce, Demande, Abort) Pour essayer / Tester votre solution.

L'exemple contient la définition de la fonction de la réponse précède acceptée .


3 commentaires

Bon problème. ici est ma tentative, mais @ Brandon's est bien meilleur.


D'ailleurs. J'ai remarqué de petits problèmes avec vos tests: 1. Vous produisez 1 , 2 , mais attendez: p1 , p2 ; 2. Vous avez une fois échangé contre attendu et réel .


Je suis désolé. Je construis ce test à la hâte et a partagé l'exemple de JSBIN dans le mauvais sens. Ainsi, je l'ai accidentellement changé plus tard pendant mes propres approches. J'ai changé les éléments vers leurs valeurs d'origine: produire: p1 et p2 ; Demande: R1 , r2 et r3 ; Abandonner: A1 .


3 Réponses :


3
votes

Ceci (note de base moins les détails) passe votre test JSBIN: xxx

et le code JSBIN .


6 commentaires

Merci pour votre solution, même si cela ne se comporte pas comme si j'aimerais. J'ai édité ma question pour être plus claire quel comportement j'aimerais avoir. Je modifie le diagramme, ajouté un descriptine et un lien à un exemple de test / Environnement sur JSBIN. J'ai utilisé votre solution dans cet exemple. Il échoue car il saute le premier élément produit en faveur du deuxième élément, qui est consommé deux fois.


Mise à jour ma réponse. Cela résoudra-t-il tous vos cas? @Megamuetzenmike


Astucieux. Je savais qu'il devait y avoir un moyen de le faire avec les opérateurs existants.


C'est essentiellement "la demande combinée à la [ABORT OU PRODUIRE" correspondante, ignorant lorsque le résultat était un abort ".


C'est tellement terres et élégant.


Entre-temps, j'ai réalisé qu'il serait beaucoup plus facile d'utiliser si des avorts sont ignorés si aucune demande sans réponse n'est arrivée auparavant.



2
votes

Je ne peux pas vraiment envelopper mon cerveau sur la façon de le faire avec les opérateurs existants. Voici comment le faire avec observable.create () : xxx

http://jsbin.com/zurpesijo/1/


2 commentaires

Belle approche. Il suffit de confirmer: appelant sub.Dispose () dispose tout rx.singleasignmentDisposable S?


Oui ComposiSitedisposable vous permet de regrouper plusieurs jetables en un seul jetable.



0
votes

Cette solution ignore les avorts qui ne suivent pas une demande sans réponse: xxx

code dans le test le plus récent sur JSBIN.


0 commentaires