我有休息api,它返回带有数据的json数组。 在客户端,我使用此代码从请求创建对象。
def get_typed_value(self):
if self.value_type == self.INTEGER:
return int(self.value)
elif self.value_type == self.STRING:
return self.value
# ... do to other type
订阅:
public getNews(): Observable<News[]> {
return this.http.get(this.baseUrl + '/news')
.pipe(
catchError(this.handleError('getNews', []))
)
.map(res => {
let response: any = res;
return response.map((item) => new News(item));
});
}
但是,当响应不是数组但只有单个元素时,如何解决问题?或者响应是错误的,例如来自API的意外数据?
目前在这些情况下我的应用程序抛出了这个错误:
response.map不是函数
答案 0 :(得分:4)
以下代码可以帮助您处理错误:
this.restProvider.getNews().subscribe((news:any) => {
this.news = news;
});
您只需在subscribe函数中添加error参数。
现在回答您的第一个问题:如果响应是单个对象怎么办? - &GT;函数的签名将始终强制它返回一个数组。订阅方将生成错误。一个简单的解决方案是更改响应的数据类型。
{{1}}
答案 1 :(得分:3)
代码,将始终返回数组:
public getNews(): Observable<News[]> {
return this.http.get(this.baseUrl + '/news')
.pipe(
catchError(this.handleError('getNews', []))
)
.map(res => {
if(Array.isArray(res)) {
return res.map((item) => new News(item));
} else {
return [new News(res)];
}
});
}
答案 2 :(得分:1)
当响应是单个对象或数组时,它显然不是一致的行为,并且使事情变得复杂。我假设后端不在你的控制之下。
您可以先检查响应类型,以确定它是数组还是对象。您可以使用Array.isArray()
。
然后,如果响应不是数组,则将其转换为const res = [response]
从那时起,getNews()
应始终返回一个数组