Angular2. Comment puis-je vérifier si un observable est terminé?
Dans ma page, il y a un bouton qui génère un rapport. Que le rapport de besoin de données qui est chargé à l'aide d'un appel http à un point de terminaison rest lorsque la page est chargée, mais je n'ai pas de garantie qu'ils sont chargés lorsque l'utilisateur appuie sur le bouton rapport.
Comment puis-je regarder les observables pour voir si elle est terminée, et si elle est incomplète, à attendre sur l'action jusqu'à ce que le http appel est terminé? Voici une partie du code:
loadCompanies(): void {
this._companyService.getCompanies().subscribe(
response => {
this.companiesModel = response;
},
err => console.log(err)
);
}
generateReport() {
//check if observable that loads companies is completed and do the
//action using companiesModel.
}
Une option est un indicateur défini dans le chargement des entreprises avec des valeurs de "chargement" et "terminé", et de les faire attendre dans generateReport()
jusqu'à ce que le drapeau est terminé,
mais je préfère une solution à l'aide de la Observable
API si possible.
OriginalL'auteur csm86 | 2017-07-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire en utilisant
onCompleted
rappel danssubscription
. Par exemple, disons que vous montrer la barre de chargement lorsque l'utilisateur presse le bouton de rapport;Si vous obtenez l'erreur à partir de votre appel http,
onCompleted
méthode ne sera pas invoquée, queonError
sera invoquée. Si elle est couronnée de succès,onCompleted
méthode sera appelée après votreonNext
méthode.Voici la documentation pour abonnez-vous. J'espère que cela aide!
OriginalL'auteur ulubeyn
La solution:
Fait souscrire fonction prend trois paramètres:
onNext
onError
onCompleted
de même. Suis-je obligé de définir un indicateur dans ce rappel? Qui se sent plus difficile qu'elle ne devrait l'être. N'est-ce pas là un fait observable.isComplete propriété?
OriginalL'auteur Valery Lyatsevich
Dans ce genre de cas, il est très utile d'utiliser concatMap opérateur de garantie pour exécuter l'opération suivante que lorsque la précédente a fait.
OriginalL'auteur yaircarreno
Méthode
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/finally.md
OriginalL'auteur Valery Lyatsevich
La solution que j'ai trouvé est d'utiliser un partagées observables, enregistrer la requête en tant qu'chaud observable que lorsque le rapport bouton est cliqué, il va attendre la demande ou de générer immédiatement si la demande est complète.
https://stackblitz.com/edit/check-if-an-observable-is-completed?file=src%2Fapp%2Fapp.component.ts
Mise à jour: Vous pouvez prendre un peu plus loin et rendre l'INTERFACE asynchrone
https://stackblitz.com/edit/check-if-an-observable-is-completed-async-ui?file=src%2Fapp%2Fapp.component.html
OriginalL'auteur William Lohan