我有一些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
答案 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),
)