2016-08-30 3 views
2

JSBIN SamplecombineAll n'émet pas sur tableau vide

J'ai un ensemble variable de composants enfant (objet POJO) qui ont chacun son propre flux d'état. Chaque fois qu'un utilisateur déclenche addChild/removeChild/clearChildren, un nouvel ensemble de flux d'état enfants est émis aveC#switchMap. Jusqu'ici tout va bien! (Et tellement surpris par RxJS!)

Avec Rx.Observable.from(arrayOfStateStreams).combineAll() Je reçois un bon résultat tant que le arrayOfStateStreams n'est pas un tableau vide. Puisqu'il s'agit d'un état partiel qui est combiné (Dernier) à un niveau supérieur, j'ai besoin d'obtenir un tableau vide ou l'arbre d'état global contiendra des anciennes données d'état qui ne sont plus vraies!

je peux émettre un certain réesrvé comme ['EMPTY-ARRAY-PLACEHOLDER-TOKEN'], mais c'est juste bizarre. Une meilleure solution serait de toujours ajouter un dernier flux dans le tableau afin que le dernier index puisse être considéré comme une corbeille. Code et état encore confus cependant. L'utilisation de [null] n'est pas correcte, car nous pourrions avoir un état enfant de 'null'.

Toute personne qui peut résoudre ce dans le bon sens? Cela ne peut-il pas être supporté puisqu'il ne devrait y avoir aucune autre représentation d'un tableau vide après #combineAll?

+0

Cela a été résolu dans https://github.com/ReactiveX/rxjs/issues/1910 –

Répondre

0

Crédits vont trxcllnt utilisateur github qui a fourni la réponse suivante:

combineAll n'émettra à moins que les Observables combinés émettent au moins une valeur, mais vous pouvez vérifier pour assurer la collecte que vous » re combinaison est vide ou non, et du cumul ou émette un tableau vide:

var arrayOfStreamsStream = Rx.Observable .of( [], [ Rx.Observable.of('blah-1'), // component state. Rx.Observable.of('blah-2'), Rx.Observable.of('blah-3') ], [], [ Rx.Observable.of('foo-1'), Rx.Observable.of('qux-2') ] ) .switchMap(function onMap(coll) { return coll.length === 0 ? Observable.of(coll) : Observable.combineLatest(...coll); }) .subscribe(function onSubscribe(data) { console.log('onSubscribe START') console.dir(data) console.log('onSubscribe END') })

2

Cela n'a rien à voir avec combineAll. Le problème est que Observable.from ne donne rien (un observable vide) lorsqu'il est passé à un tableau vide.

La seule solution viable que je peux penser si vous devez obtenir un résultat à partir d'un tableau vide est de renvoyer quelque chose d'autre dans ce cas.

Ann exemple pour illustrer le problème et une solution possible.

var data = [1, 2, 3, 4, 5]; 

log('With data: '); 
Rx.Observable.from(data) 
    .subscribe(function (d) { log('data: ' + d); }); 

// Prints: 
// With data: 
// data: 1 
// data: 2 
// data: 3 
// data: 4 
// data: 5 

var data = []; 

log('Without data: '); 
var nullDataObject = { msg: 'my null data object' }; 
Rx.Observable.from(data.length == 0 ? [nullDataObject] : data) 
    .subscribe(function (d) { log('data: ' + d); }); 

// Prints: 
// With data: 
// data: [object Object] 

Exemple exécutable sur jsfiddle.

Lors de la consommation ce vous filtrez simplement loin l'objet représentant un tableau vide, le cas échéant.

+0

Merci pour les commentaires! Il est très vrai que cela n'allait jamais fonctionner avec un tableau vide en entrée. Une meilleure solution (et une réponse acceptée) était de contourner le combinAll/combineLatest entièrement avec un sélecteur ternaire et de retourner simplement un Observable.of ([]) si la longueur === 0. –