Angular2 http.post se ejecuta dos veces


Me encontré con un extraño problema donde el servicio Http de Angular2 (RC1) ejecuta el http.post llamada dos veces. He depurado mi aplicación y sé de hecho que esto no es un problema de eventos de clic. Todas las llamadas que conducen a la llamada del servicio principal

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

Se ejecutan una vez. Luego, cuando comencé a rastrear el problema, descubrí que mi controlador this.handleObjectResponse se ejecuta dos veces. Así que profundicé más y alcancé @angular/http/src/backends/xhr_backend.ts donde hacen esto

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

Así que puse un punto de interrupción en this.request = req; y luego otro punto de interrupción en let _xhr: XMLHttpRequest = browserXHR.build(); y me enteré de que golpeé el primer punto de interrupción una vez, pero luego golpeé el segundo punto de interrupción de la devolución de llamada dos veces.

Esto me ha estado volviendo loco, así que quería comprobar si alguien familiarizado con los internos angular2 podría arrojar algo de luz si esto parece un error o algo que he hecho mal.

En mi código he creado algunas clases abstractas de servicios genéricos: GenericService y FullService que extiende GenericService. Ambos son abstractos y utilizan genéricos y las clases de servicio reales que se inyectan en los diferentes componentes se extienden ya sea GenericService o FullService. ¿Creen que esta configuración podría ser responsable de las ejecuciones de doble poste?

Todas las ideas son apreciadas!

Gracias de antemano!

P.d.

Esto no sucede con gets, pero también sucede con puts.

Author: Sangwin Gawande, 2016-05-15

3 answers

El servicio http devuelve un observable frío que se ejecuta en cada subscribe, desea convertirlo en un observable caliente que solo se ejecuta en el primer subscribe y comparte el mismo valor para subscribes posteriores.

Para convertirlo todo lo que tienes que hacer es compartir :

return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options)
.map(res => this.handleObjectResponse(res))
.share();
 57
Author: teleaziz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-15 18:06:47

Esto me estaba pasando porque tengo (key.enter)="someSubmitFunction()" en uno de los campos de entrada de un formulario. Cuando presione enter en este campo, el formulario se enviaría dos veces. Aparentemente, esto no era necesario. Cuando eliminé esto, el formulario aún se enviaría cuando presioné enter, pero ahora solo una vez.

 0
Author: mad_fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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
Author: Jayesh L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-27 06:37:58