处理api请求中的业务错误

时间:2017-01-27 16:21:33

标签: angular rxjs observable

我有一些api以格式

返回响应
import { Component, OnInit } from '@angular/core';

interface ITestItem {
  id: number;
  title: string;
}

@Component({
  selector: 'app-main',
  templateUrl: './main.component.html',
  styles: []
})
export class MainComponent implements OnInit {

  constructor(
    private apiService: ApiService
  ) { }

  ngOnInit() {
    this.apiService.apiGet<ITestItem>('/api/test')
      .subscribe(
        // only data when code = 0 or nothing
        data => console.log("data section:", data), 
        // handle http errors and message when code != 0
        error => console.log("error section:", error), 
        () => console.log("api request completed")
      );
  }

}

我尝试为此api

创建通信服务
npm install jspdf

我想在代码字段不等于0时引发异常并在订阅的错误部分返回消息。 但是当我在地图中返回Observable.throw时,它会在订阅中返回数据而不是错误。 当我尝试使用mergeMap时,异常在预期函数中按预期返回错误,但数据返回数据数组中的每个对象。这对我来说不合适。 可能我必须使用其他一些可观察的功能吗?

组件中的服务使用

npm install node-jspdf

2 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为如果可能的话,mergeMap会将结果转换为Observable。由于您的数据是一个数组,因此它将其转换为Observable并发出包含的每个元素。

使用Rx.Observable.of()中的.mergeMap包裹您的数据,使其保持为阵列发射

答案 1 :(得分:0)

基于RxJS doc,你非常接近。你需要像这样抛出异常:

 Observable.throw(new Error(api.message));

希望有所帮助

编辑更多信息

服务,根据您的需要进行必要的更改。

getTestData(): any {
    return this.http.get("testUrlShouldThrowError")
      .map((api: any) => {
        if (api.code === 0) {
          return <IApiResponse<Test>>api.data
        }
        else {
          return Observable.throw(new Error("Error!"))
        }
      });
  }

订阅:

this.testService.getTestData().subscribe(
      data => console.log(data.error.message),
    )