0
votes

Angulaire 8 http post obtenez la valeur booléenne de l'abonnement

J'ai essayé d'obtenir de la valeur de S'abonner forte> de Boolean Vrai / False, mais je ne peux pas obtenir de la valeur, voici ce que j'ai utilisé jusqu'à présent.

Mon ancien Méthode pour poteau http.
p> xxx pré>

this.success (données) code> et this.error (err) code> Les méthodes sont-elles appelées maintenant, la nouvelle façon que j'ai essayé d'obtenir des données est la suivante:

const fData = new FormData();
fData.append('Id', Id.toString());    
fData.append('IsActive', IsActive.toString());
const test = this.http.post(HostedPathConst.HostedPath + `CompanyProfile/UpdateCustomersStatus`, fData)
  .subscribe(data => {
    this.Success(data);
    this.Switch = IsActive;
    return this.Switch;
  },
    err => {
      this.Error(err);
      this.Switch = !IsActive;
      return this.Switch;
    });
    console.log(test);//Subscriber {closed: false, _parentOrParents: null, _subscriptions: Array(1), syncErrorValue: null, syncErrorThrown: false, …}
    console.log(this.Switch);//undefined at first then gives opposite result like true gives false and vice versa


4 commentaires

Je ne comprends pas vraiment le problème ici, je comprends donc que la réponse du serveur où vous faites le message retourne un BOOL, mais cela signifie qu'il fonctionne correctement et que vous pouvez obtenir une réponse du serveur.


@Erik ma valeur booléenne est une case à cocher si elle est vérifiée, il renvoie True Sinon False mais dans le premier scénario, il renvoie une valeur non définie, puis une valeur opposée si je vérifiais son faux et décoché sa true sur la console.log


Eh bien, une chose est sûre. Les opérations HTTP sont asynchrones, donc dans l'heure d'exécution, il est possible que cette console.log (this.witch); arrivera avant cela, cela.switch = isactif; Alors peut-être, c'est la raison pour laquelle vous devez non défini.


@Erik Comment puis-je utiliser synchronous un exemple serait utile ..?


3 Réponses :


1
votes

Parce que je comprends que votre problème est parce que Async Stuff, je vais écrire ici une explication. Pour l'expliquer, vous ne savez pas quand les opérations ASYNC vont se terminer. Par exemple, lorsque vous faites une fonction HTTP, vous communiquez avec un serveur, vous ne savez donc pas lorsque le serveur va répondre (en raison de la connexion lente, du trafic élevé, ou peut-être parce que vous demandez une opération lourde). < / p>

Pour résoudre ce problème, nous utilisons la méthode Subscribe () qui utilise le motif d'observateur. Donc, le point ici, c'est parce que vous ne savez pas quand le serveur ou l'opération (comme les threads) allez vous terminer, vous vous abonnez-vous et continuez à regarder tout changement ou réponse. Lorsque vous le recevez, le code à l'intérieur de l'abonnement exécute.

Vous pouvez en apprendre davantage sur le modèle d'observateur ici: https://fr.wikipedia.org/wiki/observer_pattatn#:~:text=Le%20Observer%20pattern%20is%20A,calling%20one%20Of%%% 20Their% 20methods . et async théorie ici: https://fr.wikipedia.org/wiki/asynchrony_(Computer_(Computer_Programming)

Et pour votre problème, vous pouvez introduire la valeur comme FALSE, et définir la valeur de la case à cocher comme [(NGModel)] = "Interrupteur", donc lorsque le variateur var est mis à jour la case à jour aussi!


0 commentaires

0
votes

Depuis son Observable Strong>, vous n'obtiendrez pas la réponse immédiatement. Donc, Console Log this.Switch à l'intérieur du succès et du bloc d'erreur. Essayez ci-dessous

const fData = new FormData();
fData.append('Id', Id.toString());    
fData.append('IsActive', IsActive.toString());
const test = this.http.post(HostedPathConst.HostedPath + `CompanyProfile/UpdateCustomersStatus`, fData)
  .subscribe(data => {
    this.Success(data);
    this.Switch = IsActive;
    console.log("Success", this.Switch);
    return this.Switch;
  },
    err => {
      this.Error(err);
      this.Switch = !IsActive;
      console.log("Error", this.Switch);
      return this.Switch;
    });


5 commentaires

Comme je teste à l'aide de la console.log (test); // abonné {Fermé: false, _parentorents: null, _subscriptions: tableau (1), Syncerrorvalue: null, SyncerRorthrown: false, ...} console.log (this.witch); // donne indéfini au début


Comment puis-je obtenir la valeur de retour de la souscription de «Retour this.switch» Valeur Boolean True / False ..?


Je veux juste obtenir la valeur de l'abonnement à Boolean True ou False ..


Désolé mais je présume que vous n'avez pas débogué l'extrait que j'ai fourni ci-dessus. Voir au lieu de renvoyer la valeur de this.switch dans la variable Test Pourquoi ne pouvez-vous pas utiliser directement la valeur de this.switch depuis sa une portée globale. Mais pour une raison quelconque, vous avez toujours besoin de la valeur d'abonnement à attribuer au test , veuillez vous reporter à ce lien Stackoverflow.com/questions/59448263/ASYNC-PIPIPE-WITH-RXJS?RQ = 1 * * Remarque: ** La valeur attribuée à test sera toujours de type abonnement mais pas booléen


Répondit ma propre question ci-dessous et obtenu le résultat attendu.



0
votes

utilisé async code> et attendre code> pour obtenir le résultat et fonctionnant.

const test = await this.http.post(HostedPathConst.HostedPath + `CompanyProfile/UpdateCustomersStatus`, fData)
                 .toPromise().then((data)=>{
                  this.Switch = IsActive;
                  return this.Switch;
                 }).catch((error)=>{
                  this.Switch = !IsActive;
                  return this.Switch;
                 });
    console.log(test); //Same result as below
    console.log(this.Switch); //Same result as above


1 commentaires

Vous convertissez une promesse observable en une promesse, qui n'émet que l'événement au test plus d'une fois, si cela fonctionne pour vous que Cool. Quoi qu'il en soit, le topromise () est devenu obsolète afin de mieux vérifier le lien pour alterner Stackoverflow.com/Questtions/51677405/...