34 votes

Angular2 http.post est exécuté deux fois

Je suis tombé sur un drôle de problème où l'Angular2 de l' (RC1) service Http exécute le protocole http.post appeler deux fois. J'ai réglé mon application et je sais pour un fait, ce n'est pas un événement click question. Tous les appels qui conduisent à la base d'appels de service

public create(json: Object, params?: Object): Observable<T> {
    let body = JSON.stringify([json]);
    let headers = this.getHeaders();
    let options = new RequestOptions({ headers: headers });

    return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options)
    .map(res => this.handleObjectResponse(res));
}

sont exécutées une fois. Puis, quand j'ai commencé à tracer la question, j'ai découvert que mon gestionnaire d' this.handleObjectResponse est exécuté deux fois. J'ai donc cherché plus loin et atteint @angular/http/src/backends/xhr_backend.ts où ils le font

constructor(req: Request, browserXHR: BrowserXhr, baseResponseOptions?: ResponseOptions) {
    this.request = req;
    this.response = new Observable<Response>((responseObserver: Observer<Response>) => {
        let _xhr: XMLHttpRequest = browserXHR.build();
        _xhr.open(RequestMethod[req.method].toUpperCase(), req.url);
        // load event handler
        ...
        ..

J'ai donc mis un point d'arrêt sur this.request = req; , puis un autre point d'arrêt sur let _xhr: XMLHttpRequest = browserXHR.build(); et j'ai trouvé, j'ai frappé le premier point d'arrêt une fois, mais ensuite, j'ai frappé le deuxième point d'arrêt de la fonction de rappel à deux reprises.

Cela a été me rend fou j'ai donc voulu vérifier si quiconque est familier avec la angular2 internes pourrait jeter quelque lumière si cela ressemble à un bug ou quelque chose que j'ai fait de mal.

Dans mon code, j'ai créé abstraite générique classes de service: GenericService et de FullService qui s'étend GenericService. Ces deux sont abstraites et l'utilisation des génériques et le réel, les classes de service qui sont alors injectés dans les différents composants de tous, soit GenericService ou de FullService. Avez-vous les gars pense que cette configuration pourrait être responsable pour le double post exécutions?

Toutes les idées sont appréciées!

Merci à l'avance!

P. S.

Ce n'est pas le cas avec les obtient, mais il arrive aussi avec des options de vente.

66voto

teleaziz Points 1907

Le service http renvoie un froid observables qui se exécutée sur chaque abonnez-vous, vous voulez les convertir en un chaud observables qui se exécute uniquement sur la première vous abonner et de partager la même valeur pour la suite souscrit.

Pour convertir tout ce que vous avez à faire est de partager ça:

return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options)
.map(res => this.handleObjectResponse(res))
.share();

1voto

mad_fox Points 871

Ce qui se passait pour moi parce que j'ai (key.enter)="someSubmitFunction()" sur l'un des champs de saisie d'un formulaire. Quand j'ai frappé entrer sur ce terrain, la forme que pourrait présenter deux fois. Apparemment, ce n'était pas nécessaire. Quand j'ai enlevé ce, la forme serait encore soumettre, quand j'appuie sur entrer, mais maintenant qu'une seule fois.

0voto

Jayesh L Points 67
its happening because HTTP OPTIONS executed first, and you have to restrict unwanted HTTP method before executing your Logic, always use isset method,see example below

 if(isset($_POST))
 {
    $name = $_POST["name"];
    $country = $_POST["country"];

    $sql = 'INSERT INTO user values("' . $name . '","' . $country . '")';

            if ( $conn->query($sql)=== TRUE) 
            {
                $outp =  "Inserted " .  $name . "  and  "  . $country;
                echo json_encode($outp);
            } else {
                echo json_encode("Error: " . $sql . "<br>" . $conn->error);
            }
        }


here it will insert row in table only when its POST METHOD.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X