Подтвердить что ты не робот

Angular2 http.post выполняется дважды

Я столкнулся с странной проблемой, когда услуга Http Angular2 (RC1) выполняет вызов http.post дважды. Я отлаживал свое приложение, и я знаю, что это не проблема с событием клика. Все вызовы, вызывающие основной вызов службы

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

запускаются один раз. Затем, когда я начал отслеживать проблему, я узнал, что мой обработчик this.handleObjectResponse выполняется дважды. Поэтому я добрался дальше и достиг @angular/http/src/backends/xhr_backend.ts, где они делают это

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

Итак, я поставил точку останова на this.request = req;, а затем другую точку останова на let _xhr: XMLHttpRequest = browserXHR.build();, и я узнал, что однажды ударил первую точку останова, но затем дважды ударил вторую точку останова из обратного вызова.

Это заставило меня замочить, поэтому я хотел проверить, может ли кто-нибудь, знакомый с внутренними элементами Angular2, пролить свет, похоже ли это на ошибку или что-то, что я сделал неправильно.

В моем коде я создал несколько абстрактных классов общих сервисов: GenericService и FullService, который расширяет GenericService. Оба эти являются абстрактными и используют generics, а реальные классы обслуживания, которые вводятся в различные компоненты, распространяются либо на GenericService, либо на FullService. Вы, ребята, думаете, что эта установка может быть ответственна за выполнение двойных сообщений?

Все идеи оценены!

Спасибо заранее!

P.S.

Это не происходит с get, но это также происходит с puts.

4b9b3361

Ответ 1

Служба http возвращает холодную видимость, которая получает выполненный на каждой подписке, вы хотите преобразовать ее в горячую наблюдаемую, которая выполняется только в первые подписываются и имеют одинаковое значение для последующих подписчиков.

Чтобы преобразовать все, что вам нужно сделать, это share it:

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

Ответ 2

Это происходило со мной, потому что у меня есть (key.enter)="someSubmitFunction()" в одном из полей ввода формы. Когда я нажму "Enter" в этом поле, форма будет отправляться дважды. По-видимому, это не было необходимо. Когда я удалю это, форма все равно будет отправлена, когда я нажму кнопку enter, но теперь только один раз.

Ответ 3

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.