{
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の通信サービスを作成しようとした形式でレスポンスを返すいくつかの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ではなく、サブスクライブのエラー部分にメッセージを返します。 しかし、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")
);
}
}
はい、それは動作します!しかし、私はObservable.throwがマップとマージマップでなぜ動作するのかを理解できません。 – avvensis
map関数は結果をObservableにキャストしないので、マップ関数がObservable.throwを返すとき、それはsubscribeの 'next'関数に送出する値になります。 –