0
votes

Problème à l'aide de la fonction async / attendre avec angulaire

Bonjour,

Même après avoir lu sur les concepts et les utilisations de async code> et attendre code>, j'ai toujours des problèmes de réel aplicattions d'entre eux. p>

Fondamentalement dans mon ngoninit code> i appel d'appel à une fonction: p> xxx pré>

fonction: p>

async authenticateUser() {

    console.log("----Autenticando Usuário----");

    this.token = localStorage.getItem("token");
    this.userName = localStorage.getItem("userName");
    this.userPhoto = localStorage.getItem("userPhoto");

    this.currentUser = await this.auth.getSession(this.token);

    this.attributions = this.currentUser.sessao.grupos;
    this.userEmail = this.currentUser.sessao.email;
    this.instalation = this.currentUser.instalacao;

   }


2 commentaires

Dupliqué possible de Comment puis-je retourner la réponse d'une asynchrone appelez?


Déjà essayé cette solution, n'a pas fonctionné


3 Réponses :


0
votes

Bien que votre méthode GETESSION Essaie d'effectuer une action asynchrone, vous ne l'avez pas configuré pour le faire correctement. Vous retournez actuelUtiliser en dehors du S'abonner Block, et toute la méthode n'a aucun moyen de dire à son appelant qu'il est asynchrone, alors async / attendre ne fera pas de différence.

En ce qui concerne les méthodes asynchronisées, vous avez quelques choix. En angulaire, nous utilisons généralement des observables car ils permettent le plus de contrôle. Dans ce cas, vous pouvez simplement renvoyer le http.post observable dans GETESTESSION , puis vous abonnez-vous dans authogédicuer . Ensuite, vous pouvez soit mettre les lignes suivantes à l'intérieur du S'abonner Call ou Utilisez les opérateurs et rxjs pour effectuer les actions suivantes.

Vous pouvez également avoir GETESTESSION Renvoyer un Promise qui résout avec les données requises. Cela permettrait à Async / attendre de travailler (bien que ce ne soit pas un motif angulaire).


2 commentaires

Lorsque j'essaie de vous abonner à l'authentificateur , il apparaît uniquement pour vous désabonner, savez-vous pourquoi cela se produirait-il?


Parce que vous retournez l'abonnement car vous avez laissé le S'abonner Appel dans GETESSION Comme je l'ai dit, vous prenez le S'abonner < / Code> Appel de GETESTESSION et placez-le dans authentifieruser .



0
votes

GETESSIES () doit rendre une promesse pour attendre de travailler dans ce cas. XXX PRE>

ou P>

getSession(){
    return new Promise((resolve, reject) => {
        ...
        resolve(data)
    })
}


0 commentaires

0
votes

Vous pouvez tuyer avec une carte de RXJS à votre valeur de retour et définissez sur JSON. La promesse et les observables sont légères différents même si les deux sont des opérations asynchrones. Lorsque vous utilisez un motif observable et que vous avez fixé l'écoute lorsque vous vous abonnez, cela signifie que vous pouvez recevoir plusieurs valeurs plus tard (ASYNC). Le modèle de promesse vous donne une valeur plus tard que vous allez écouter de la résolution (résultat). XXX Pré>

Donc, dans votre cas, P>

getSession(xtrToken) {
    xtrToken = "{\"token\":\"" + xtrToken.toString() + "\"}";
    this.http.post(this.apiURL + "/auth", xtrToken)
      .map((resposta) => {
        if (resposta != null) {
          localStorage.setItem("currentUser", JSON.stringify(resposta));
          if (window.location.href.indexOf("?") > -1) {
            var url = window.location.href;
            var value = url = url.slice(0, url.indexOf('?'));
            value = value.replace('@System.Web.Configuration.WebConfigurationManager.AppSettings["BaseURL"]', '');
            var newUrl = value;
            window.history.pushState({}, null, newUrl);
          }
          this.currentUser = JSON.parse(localStorage.getItem("currentUser"));
        }
      });
      return this.currentUser;
  }

authenticateUser() {

    console.log("----Autenticando Usuário----");

    this.token = localStorage.getItem("token");
    this.userName = localStorage.getItem("userName");
    this.userPhoto = localStorage.getItem("userPhoto");

    this.auth.getSession(this.token).subscribe((result) => {
    this.currentUser = result;
    });

    this.attributions = this.currentUser.sessao.grupos;
    this.userEmail = this.currentUser.sessao.email;
    this.instalation = this.currentUser.instalacao;

   }


1 commentaires

mettre les lignées de ceci.Attributions = ceci.currenttuser, cela.useremail .. Inside abcaye fonction