4 votes

Filtrer un observable par un observable

Considérons la situation simplifiée suivante :

  • Nous avons une pomme Observable de type Observable < Pomme >.
  • Chaque objet Apple possède une méthode isRotten() qui renvoie un observable de type Observable < Boolean > dont l'émission d'au moins une valeur booléenne est garantie.

Je veux filtrer les pommes observables de telle sorte que les pommes pourries ne passent pas le filtre. Plus précisément, une pomme A passe le filtre si et seulement si le premier élément émis par A.isRotten() est faux. Quelle est la meilleure façon d'implémenter ce filtre ?

Après avoir réfléchi, je suis arrivé à cette conclusion :

apples
    .concatMap(apple => 
        apple.isRotten()
            .first()
            .filter(bool => bool)
            .map(bool => apple))

Qui est écrit en javascript. ( ... => ... est une fonction). Cela fonctionne, mais je pense que c'est plutôt long et difficile à comprendre. Existe-t-il une meilleure façon de faire ce genre de choses ?

2voto

Richard Szalay Points 42486

Ce que vous avez fait est bien et, à vrai dire, je ne vois pas de manière plus concise de le faire. J'utiliserais probablement flatMap plutôt que concatMap si les pommes en rupture de stock ne sont pas un problème.

Si la lisibilité est un problème pour vous, il suffit de déplacer l'implémentation dans une seule fonction (par exemple. filterObservable qui accepte une fonction qui prend une valeur et renvoie une IObservable<bool> )

-3voto

Toan Nguyen Points 3342

Vous pouvez faire quelque chose comme ça :

var seq = Rx.Observable.from([1, 2, 3, 4, 5, 6])
    .filter(x => {
        let isRotten = true;
        Rx.Observable.just(x % 2 === 0)
            .first()
            .subscribe(val => isRotten = val);

        if (isRotten) {
            return x;
        }
    });

seq.subscribe(x => console.log(x));

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