webentwicklung-frage-antwort-db.com.de

Angular2 http.post wird zweimal ausgeführt

Ich bin auf ein seltsames Problem gestoßen, bei dem der HTTP-Dienst von Angular2 (RC1) den http.post-Aufruf zweimal ausführt. Ich habe meine App debuggt und weiß, dass dies kein Problem mit dem Klickereignis ist. Alle Anrufe, die zum Core-Serviceabruf führen

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));
}

werden einmal ausgeführt. Als ich dann das Problem aufspürte, stellte ich fest, dass mein Handler this.handleObjectResponse zweimal ausgeführt wird. Also ging ich weiter und erreichte @angular/http/src/backends/xhr_backend.ts, wo sie das tun

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
        ...
        ..

Also habe ich einen Haltepunkt auf this.request = req; gesetzt und dann einen weiteren Haltepunkt auf let _xhr: XMLHttpRequest = browserXHR.build(); und ich habe herausgefunden, dass ich den ersten Haltepunkt einmal getroffen habe, aber dann den zweiten Haltepunkt aus dem Rückruf zweimal traf.

Das hat mich verrückt gemacht, also wollte ich prüfen, ob jemand, der sich mit den inneren Winkeln von Angle2 auskennt, etwas Licht werfen kann, ob dies wie ein Bug aussieht oder etwas, das ich falsch gemacht habe.

In meinem Code habe ich einige abstrakte generische Serviceklassen erstellt: GenericService und FullService, die GenericService erweitern. Beide sind abstrakt und verwenden Generika. Die realen Serviceklassen, die in die verschiedenen Komponenten eingefügt werden, erweitern entweder GenericService oder FullService. Glaubst du, dass dieses Setup möglicherweise für die doppelten Post-Hinrichtungen verantwortlich ist?

Alle Ideen werden geschätzt!

Danke im Voraus!

P.S.

Dies passiert nicht mit get, sondern auch mit puts.

32
RVP

Der http-Dienst gibt ein kaltes Observable zurück, das für jedes Abonnement ausgeführt wird. Sie möchten es in ein heißes Observable umwandeln, das nur beim ersten Abonnement ausgeführt wird und denselben Wert für nachfolgende Subskriptionen verwendet.

Alles, was Sie tun müssen, ist share it:

return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options)
.map(res => this.handleObjectResponse(res))
.share();
63
teleaziz
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
Jayesh L

Dies ist mir passiert, weil ich (key.enter)="someSubmitFunction()" in einem der Eingabefelder eines Formulars habe. Wenn ich in diesem Feld die Eingabetaste drücke, wurde das Formular zweimal gesendet. Anscheinend war das nicht nötig. Wenn ich das entfernte, wurde das Formular immer noch gesendet, wenn ich die Eingabetaste drücke, aber jetzt nur noch einmal.

0
mad_fox