【发布时间】:2017-01-27 16:21:32
【问题描述】:
我有一些 api 以格式返回响应
{
code: 0, // 0 is Ok, all other values is error
data: [{...}, {...}, {...}, ...], // data objects
message: "" // empty when ok or some error message in other cases
}
我尝试为这个api创建通信服务
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
interface IApiResponse<T> {
code: number;
data: Array<T>;
message: string;
}
@Injectable()
export class ApiService {
constructor(
private http: Http
) { }
apiGet<T>(url: string): Observable<Array<T>> {
return this.http.get(url)
.map((res: Response) => res.json())
//.map((api: IApiResponse<T>) => api.code === 0 ? api.data : Observable.throw(api.message))
.mergeMap((api: IApiResponse<T>) => api.code === 0 ? api.data : Observable.throw(api.message))
.catch(err => Observable.throw(err));
}
}
我想在代码字段不等于 0 时引发异常,并在订阅的错误部分返回消息。 但是当我在 map 中返回 Observable.throw 时,它作为订阅中的数据返回,而不是作为错误返回。 当我尝试使用mergeMap 时,异常在订阅函数中按预期返回错误,但数据数组中的每个对象都返回数据。这不适合我。 可能我必须为此使用其他一些可观察的函数吗?
组件中的服务使用
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")
);
}
}
【问题讨论】:
标签: angular rxjs observable