Observables.forkJoin() n'est pas exécuté
J'ai le code suivant:
//Loop: For each user ID/Role ID, get the data
userMeta.forEach((businessRole) => {
Observable.forkJoin(
af.database.object('/roles/'+businessRole.$value),
af.database.object('/users/'+businessRole.$key)
).subscribe(
data => {
console.log("Data received");
data[1].role = data[0];
this.users.push(data[1]);
},
err => console.error(err)
);
Je suis en train de vous abonner à un résultat de 2 observables à l'aide de forkJoin
.
Pour certaines raisons, les "Données reçues" le message n'est pas affiché.
Mon userMeta
variables ressemble bien à la console.journal:
Quel est le problème?
Mise à jour: le code suivant ne retourne rien, soit
let source = Observable.forkJoin(
af.database.object('/roles/'+businessRole.$value),
af.database.object('/users/'+businessRole.$key)
);
let subscription = source.subscribe(
function (x) {
console.log("GOT: " + x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
Ce que j'ai vraiment essayé de faire est d'améliorer les performances du code suivant:
//Subscription 3: role ID to role Name
af.database.object('/roles/'+businessRole.$value)
.subscribe((roleData) => {
//Subscription 4: Get user info
af.database.object('/users/'+businessRole.$key).subscribe(user => {
forkJoin()
émet une valeur après deux Observables, donc êtes-vous sûr qu'ils font? Peut-être que l'un d'entre eux avec un message d'erreur...Pas trop d'erreurs (voir la question de mise à jour). Ils doivent également travailler parce que l'ancien code était un abonnez-vous à l'intérieur d'un abonnez-vous, et cela a fonctionné
forkJoin()
ne passe pas des erreurs à partir de la source Observables donc, ce ne sont pas imprimer quoi que ce soit même si il a jeté les erreurs. Si vous voulez vous assurer qu'il n'émet pas d'erreurs, vous devez vous abonner à chacun de la source de phénomènes Observables.OriginalL'auteur TheUnreal | 2016-10-28
Vous devez vous connecter pour publier un commentaire.
forkJoin()
exige que tous les source de phénomènes Observables à émettre au moins une fois et complète.Cette démonstration suivante est terminée comme prévu:
Démo Live: https://stackblitz.com/edit/rxjs-urhkni
Jan 2019: mise à Jour pour RxJS 6
forkJoin()
. C'est vraiment étrange...Mais ce n'est pas la même chose que ce que vous voulez faire avec
forkJoin()
..subscribe((roleData) => {...
émet une valeur sur chaquenext
appel.forkJoin()
. forkJoin() nécessite à la fois Observables pour terminer. sinon, il n'émet pas de quoi que ce soit.Ainsi il semble que comme je m'ennuie-utilisé
forkJoin()
. Parce que votre réponse est corrcet, je vais approuver et à ouvrir une nouvelle question au sujet de mon casObservable.combineLatest()
peut-être ce que vous êtes à la recherche pour @TheUnreal.Je vous remercie. Si je pouvais upvote vous deux fois, je le ferais.
OriginalL'auteur martin
J'ai eu un problème similaire en utilisant Angulaire 2 /Angularfire 2, plus précisément, où j'ai été à la recherche de savoir si les utilisateurs ont existé par e-mail. Dans un cas, l'utilisateur existe et j'ai reçu un tableau d'un objet à partir de l'Observable. Dans les autres cas, l'utilisateur n'existe pas, et j'ai reçu un tableau vide.
Lorsque j'ai utilisé forkJoin avec un resultSelector et une souscription, ni la resultSelector ni la fonction subscribe jamais couru. Cependant, quand j'ai essayé
À la fois le sélecteur et la abonnez-vous travaillé. Je suppose que cela a à voir avec @martin réponse, où forkJoin nécessite des observables pour terminer, parce que, par définition, il renvoie le la dernière de serre. Si un observables ne se termine jamais, je suppose qu'il ne peut jamais avoir un dernier émission.
Peut-être angularfire liste des observables (ou de l'objet observables dans votre cas) ne sont jamais complets, ce qui rend l'utilisation de forkJoin impossible. Heureusement zip a similaire comportement et fonctionne encore, la différence étant qu'il peut répéter l'opération plusieurs fois si les modifications de données dans Firebase, où que forkJoin seulement combine la dernière réponse.
Dans mon cas, je suis à la recherche d'1) à l'aide de zip et accepter que mon code peut s'exécuter plusieurs fois si les données de l'utilisateur des modifications lors de l' .zip est toujours en cours, 2) désactiver manuellement le zip après la première série de données retourne, ou 3) le fossé Angularfire et d'essayer la Firebase api directement, en utilisant quelque chose comme .une fois pour voir si je peux obtenir une observable qui complète et déclenche forkJoin.
Observable.combineLatest
au lieu deObservable.forkJoin
. Les crédits vont à github.com/angular/angularfire2/issues/617Merci pour ce partage, c'est vraiment très utile.
OriginalL'auteur ansorensen
J'ai été confronté à un problème similaire: j'ai été la création d'une liste des observables de façon dynamique et j'ai remarqué que
forkjoin()
jamais émet ni n'complète si la liste des observables est vide alors quePromise.all()
résout avec une liste vide :La solution de contournement que j'ai trouvé est de vérifier la longueur de la liste et de ne pas utiliser cet opérateur lorsqu'il est vide.
OriginalL'auteur bgondy