J'ai besoin de zip groupables observables (pour former le produit cartésien des groupes liés, mais ce n'est pas pertinent pour la question). Lorsque vous exécutez le code ci-dessous, seuls les groupes observables enfants émettent réellement des valeurs à l'intérieur du #zip - Pourquoi est-ce?RxJS #zip groupes créés en utilisant #groupBy
https://jsbin.com/coqeqaxoci/edit?js,console
var parent = Rx.Observable.from([1,2,3]).publish();
var child = parent.map(x => x).publish();
var groupedParent = parent.groupBy(x => x);
var groupedChild = child.groupBy(x => x);
Rx.Observable.zip([groupedChild, groupedParent])
.map(groups => {
groups[0].subscribe(x => console.log('zipped child ' + x)); // -> emitting
groups[1].subscribe(x => console.log('zipped parent ' + x)); // -> not emitting
})
.subscribe();
groupedChild.subscribe(group => {
group.subscribe(value => console.log('child ' + value)); // -> emitting
});
groupedParent.subscribe(group => {
group.subscribe(value => console.log('parent ' + value)); // -> emitting
});
child.connect();
parent.connect();
Modifier: Comme expliqué dans la réponse par user3743222, les groupes émis par groupBy sont hot et l'abonnement au groupe parent (groupes [1]) se produit après que les premières valeurs ont déjà été émis. Cela se produit lorsque #zip attend à la fois que groupedChild et groupedParent émettent, ce dernier émettant plus tôt (ce qui signifie que ses groupes émettent des valeurs avant l'exécution de la fonction #zip).
Merci! Pouvez-vous expliquer pourquoi l'enfant observable a déjà transmis sa valeur lors de l'inscription dans #zip? Je ne comprends pas comment cela se passe ... En ce qui concerne 2 .: publier n'est pas nécessaire dans l'exemple que j'ai donné, je l'ai simplement inclus car il sera nécessaire dans le script complet. –
'groupBy' est lié à' groupByUntil': 'https: // github.com/Reactive-Extensions/RxJS/blob/maître/src/core/linq/observable/groupbyuntil.js' Chaque fois qu'il y a une nouvelle clé (ie groupe), une observable est créée. Mais cet observable est un 'Rx.Subject' qui est aussi une source chaude: il émet sa valeur immédiatement (cf L35). Cette observable est emballée et émise à l'observateur (L41, L49). Ensuite, la valeur de cette clé (groupe) est émise (immédiatement) à travers le sujet (L75). En bref, si vous ne vous abonnez pas à cet observable dès qu'il est transmis, vous perdrez toujours la première valeur. – user3743222
Si vous n'êtes pas familier avec les observables chauds et froids, voici deux ressources traitant de la question: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold- vs-observables à chaud; http://jaredforsyth.com/2015/03/06/visualizing-reactive-streams-hot-and-cold/ – user3743222