Angular2 http.le message est exécuté deux fois

Je suis tombé sur un problème étrange où le service HTTP Angular2 (RC1) exécute le http.post appeler deux fois. J'ai débogué mon application et je sais pertinemment que ce n'est pas un problème d'événement de clic. Tous les appels qui mènent à l'appel de service de base

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és une fois. Puis, quand j'ai commencé à suivre le problème, j'ai découvert que mon gestionnaire this.handleObjectResponse était exécuté deux fois. J'ai donc fouillé plus loin et j'ai 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
        ...
        ..

, Donc j'ai 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 découvert que j'ai frappé le premier point d'arrêt Une fois, mais ensuite j'ai frappé le deuxième point d'arrêt du rappel deux fois.

Cela m'a rendu fou, donc je voulais vérifier si quelqu'un familier avec les internes angular2 pouvait faire la lumière si cela ressemble à un bug ou quelque chose que j'ai mal fait.

Dans mon code, j'ai créé des classes de service génériques abstraites: GenericService et FullService qui étend GenericService. Les deux sont abstraits et utilisent des génériques et les classes de service réelles qui sont injectées dans les différents composants étendent toutes GenericService ou FullService. Pensez-vous que cette configuration pourrait être responsable des exécutions à double post?

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

Merci d'avance!

P.S.

Cela n'arrive pas avec Les gets mais cela arrive aussi avec les puts.

30
demandé sur Sangwin Gawande 2016-05-15 20:13:19

3 réponses

Le service http renvoie une observable à froid qui obtient exécutée sur chaque Abonnement, vous voulez la convertir en une observable à chaud qui n'est exécutée que sur le premier abonnement et partager la même valeur pour les abonnements suivants.

Pour convertir tout ce que vous avez à faire est de partager, il:

return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options)
.map(res => this.handleObjectResponse(res))
.share();
57
répondu teleaziz 2016-05-15 18:06:47

Cela m'arrivait parce que j'ai (key.enter)="someSubmitFunction()" sur l'un des champs de saisie d'un formulaire. Lorsque je clique sur entrée dans ce champ, le formulaire serait soumis deux fois. Apparemment, ce n'était pas nécessaire. Lorsque j'ai supprimé cela, le formulaire serait toujours soumis lorsque je clique sur Entrée, mais maintenant une seule fois.

0
répondu mad_fox 2017-10-17 02:37:11
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.
0
répondu Jayesh L 2017-11-27 06:37:58