带有事件/可观察值的服务的成功/错误报告

Success / Error Reporting from Service with Events / Observables

使用我在网上找到的一些文档,我编写了一个服务方法来保存一些数据,如下所示:

@Injectable
export class BrandService {

  brands$: Observable<Brand[]>;
  private _brandsObserver: Observer<Brand[]>;
  private _dataStore: {
      brands: Brand[]
  };

  constructor(private http: Http) {
    this.brands$ = new Observable(observer => this._brandsObserver = observer).share();
    this._dataStore = { brands: []};
  }

  saveBrand(brand: Brand) {
    var headers = new Headers();
    headers.append('Content-Type', 'application/json');
    return this.http.post("http://localhost:8080/api/brands", JSON.stringify(brand), { headers: headers })
       .map( (response: Response) => response.json()).subscribe(
           data => {
             this._dataStore.brands.push(data);
             this._brandsObserver.next(this._dataStore.brands);
           }, 
           error => console.log("Could not create Brand"));
  }
}

这允许我做的是将更新推送到我的品牌集合,我在视图上的 table 将观察这些更改并自动更新,因此我不必手动刷新它。世界上一切都很好。

我的问题是,由于我订阅了服务中的 http.post,我的组件现在无法知道此调用是否成功,这也意味着,因为我正在展示模式对话框中的表单,我不知道是否应该关闭对话框或显示错误。我的组件只是这样做...

this._brandService.saveBrand(this.brandForm.value);

所以,我在想我应该想出一种方法来 a) 在组件中监听的服务中触发一个事件,以便在好事/坏事发生时采取相应的行动,或者 b) 图以某种方式观察服务中的其他一些属性,当检测到这些更改时,我可以根据这些属性采取行动。但我对所有这些可观察的东西都很陌生,我什至不知道从哪里开始。

data => {
  this._dataStore.brands.push(data);
  this._brandsObserver.next(this._dataStore.brands);
  // fire some success event or
  // update some observed property
}, 
error => {
  // fire some failure event or
  // update some observed property
}

您可以在呼叫站点subscribe()

saveBrand(brand: Brand) {
    var headers = new Headers();
    headers.append('Content-Type', 'application/json');
    return this.http.post("http://localhost:8080/api/brands", JSON.stringify(brand), { headers: headers })
       .map( (response: Response) => response.json()).map(
           data => {
             this._dataStore.brands.push(data);
             this._brandsObserver.next(this._dataStore.brands);
           });
  }
this._brandService.saveBrand(this.brandForm.value)
.subscribe(
    value => onSuccess(),
    error => onError());

如果您仍想在 saveBrand 中进行一些一般性错误处理,您可以使用 catch 运算符(就像在 中使用的那样)