为Angular 2 Http订阅两次?

问题描述:

我想要调用一个API来正确处理请求并对API请求执行标准错误处理。例如,我有一个ApiErrorsService,我想在任何API调用发生错误时调用它。我还希望以标准方式提交调用,即将Content-Type设置为application/json并序列化请求对象。为Angular 2 Http订阅两次?

当然,当我订阅从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; 
} 

使用share是矫枉过正。如果您只想处理内联错误,则可以使用do代替:

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

使用share就够了,HTTP可观察自动完成,所以你不必退订。除非你要在异步方法(setTimeout/etc)中订阅第二个监听器,否则没有办法错过值。