Angular2 http.post é executado duas vezes

Eu me deparei com um problema estranho onde o serviço Http do Angular2 (RC1) executa a chamada http.post duas vezes. Depurei meu aplicativo e sei que, de fato, isso não é um problema de evento de clique. Todas as chamadas que levam à chamada de serviço principal

public create(json: Object, params?: Object): Observable { 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)); } 

são executados uma vez. Então, quando comecei a rastrear o problema, descobri que meu manipulador this.handleObjectResponse foi executado duas vezes. Então eu investiguei mais e alcancei @angular/http/src/backends/xhr_backend.ts onde eles fazem isso

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

Então eu coloquei um ponto de interrupção em this.request = req; e, em seguida, outro ponto de interrupção em let _xhr: XMLHttpRequest = browserXHR.build(); e descobri que atingi o primeiro ponto de interrupção uma vez, mas depois acertei o segundo breakpoint do callback duas vezes.

Isso tem me deixado louco, então eu queria checar se alguém familiarizado com os internos do angular2 poderia esclarecer se isso parece um bug ou algo que eu fiz de errado.

No meu código, criei algumas classs de serviço genéricas abstratas: GenericService e FullService, que estendem o GenericService. Ambos são abstratos e usam genéricos e as classs de serviço reais que são injetadas nos diferentes componentes estendem GenericService ou FullService. Vocês acham que essa configuração poderia ser responsável pelas execuções de postes duplos?

Todas as ideias são apreciadas!

Desde já, obrigado!

PS

Isso não acontece com get, mas também acontece com puts.

O serviço http retorna um cold observable que é executado em cada assinatura , você deseja convertê-lo em um hot observable que só é executado na primeira assinatura e compartilha o mesmo valor para assinantes subseqüentes.

Para converter tudo o que você precisa fazer é compartilhá- lo:

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

Isso estava acontecendo comigo porque eu tenho (key.enter)="someSubmitFunction()" em um dos campos de input de um formulário. Quando eu apertei enter neste campo o formulário iria enviar duas vezes. Aparentemente, isso não era necessário. Quando removi isso, o formulário ainda seria enviado quando eu pressionasse enter, mas agora apenas uma vez.

 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 . "
" . $conn->error); } } here it will insert row in table only when its POST METHOD.