订阅两次到Angular 2 Http?

时间:2016-04-21 21:09:39

标签: angular rxjs angular2-http

我希望有一个服务来调用API来正确处理请求并对API请求执行标准错误处理。例如,当任何API调用出现错误时,我想要调用ApiErrorsService。我还想以标准方式提交调用,即将Content-Type设置为application / json并序列化请求对象。

当然,当我订阅从Http返回的observable时,它被调用一次,当我返回它并且调用者订阅时,它再次被调用。在不执行两次API调用的情况下,能够在两个地方监听结果的最佳方法是什么?我可以致电.publish().share()并退回吗?我需要处理它吗?是否有可能发生的时间问题?如果我嘲笑API调用并立即返回一个值,那么工作正常,或者调用者的订阅是否会错过这些值?这是我的代码:

post(path: string, data: any): Observable<Response> {
    var headers: Headers = new Headers();
    headers.set("Content-Type", "application/json");
    var s = data == null ? null : JSON.stringify(data, null, 2);
    var shared = this.http.post(path, s, { headers: headers }).share();
    shared.subscribe(null, err => this.appErrorsService.addApiError(err));
    return shared;
}

2 个答案:

答案 0 :(得分:3)

使用share是过度的。如果您只想内联处理错误,可以改为使用do

return this.http.post(path, s, { headers: headers })
   .do(null, err => this.appErrorsService.addApiError(err));

答案 1 :(得分:2)

使用share就足够了,http Observable会自动完成,因此您无需取消订阅。除非您要在异步方法(setTimeout / etc)中订阅第二个侦听器,否则无法错过值。