将Observable映射到对象数组

时间:2018-04-12 08:55:36

标签: angular typescript ionic-framework

我有休息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不是函数

3 个答案:

答案 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()应始终返回一个数组