Angular2 http.post执行两次

RVP*_*RVP 33 post http angular

我遇到了一个奇怪的问题,Angular2的(RC1)Http服务执行两次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));
}
Run Code Online (Sandbox Code Playgroud)

运行一次.然后,当我开始跟踪问题时,我发现我的处理程序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
        ...
        ..
Run Code Online (Sandbox Code Playgroud)

所以我打开一个断点this.request = req;,然后打开另一个断点let _xhr: XMLHttpRequest = browserXHR.build();,我发现我击中了第一个断点,但后来我从回调中击中了第二个断点两次.

这让我疯了,所以我想检查一下熟悉angular2内部的人是否可以说明这看起来像是一个错误或者我做错了什么.

在我的代码中,我创建了一些抽象的通用服务类:GenericService和FullService,它扩展了GenericService.这两个都是抽象的并且使用泛型,并且在不同组件中注入的实际服务类都扩展了GenericService或FullService.你们认为这个设置可能是双重执行后的责任吗?

所有的想法都很感激!

提前致谢!

PS

这不会发生在获取,但它也发生在put.

tel*_*ziz 64

http服务返回一个在每个订阅上执行的冷可观察对象,您希望将其转换为仅在第一个订阅时执行的热可观察对象,并为后续订阅共享相同的值.

要转换它,您只需分享它:

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

  • 然后他们应该用非棘手的代码替换,因为"棘手"会倒退,使事情变得更糟,而不是完美的工作 (4认同)
  • 所以我想如果你从方法中返回,总是在http调用之后放置share()是一个很好的做法 (3认同)
  • 仅仅因为我需要它,如果你有一个**catch()**子句,顺序应该是:**.map(...).catch(...).share()**. (3认同)
  • 在 Angular 7 中,我得到“属性‘共享’在类型‘Observable&lt;Response&gt;’上不存在”。解决方案是 `import { share } from 'rxjs/operators'` 然后 `http.post().pipe(share())` (2认同)