我遇到了一个奇怪的问题,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)); }
运行一次然后当我开始跟踪问题时,我发现我的处理程序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上然后在另一个断点_xhr:XMLHttpRequest = browserXHR.build();我发现我打了第一个断点一次,但是我从回调中打了第二个断点两次。
这一直驱使我坚强,所以我想检查一下熟悉角度2内部的人是否可以清楚地看出,这是否看起来像一个错误或我做错了的东西。
在我的代码中,我创建了一些抽象的通用服务类:GenericService和FullService,它扩展了GenericService。这两个都是抽象的,并且使用泛型,并且注入到不同组件中的实际服务类都扩展为GenericService或FullService。你们认为这个设置可能会对双重执行时间负责吗?
所有的想法都不胜感激!
提前致谢!
附:
这不会发生在get但它也发生在put。
http服务返回一个获得
executed on every subscribe的冷可观察值,您要将其转换为仅在第一个订阅时执行的热可观察值,并为后续订阅共享相同的值。
要转换所有你要做的是share它:
return this._http.post(this.createURL(this.getCreateURL(),options) .map(res => this.handleObjectResponse(res)) .share();