Angular 2 http服务返回不可变数据问题

时间:2016-11-30 23:48:31

标签: angular immutable.js angular2-http

我在Angular 2中使用以下方法提供服务:

getEntityById = (id: number | string): Observable<Immutable.Iterable<any, any>> =>
    this.http.get(`${this.baseUrl}/${id}`)
        .map((response: Response) => Immutable.fromJS(this.helper.getResponseAsJson(response)))
        .share();

我的目标如下:

  • 从后端返回不可变版本的数据,以便订阅者不会以影响其他订阅者的方式改变数据
  • 仅在直接调用getEntityById()方法时进行提取,而不是在订阅时进行提取,因此使用share()

正常运行,但我不喜欢它返回基础类型Immutable.Iterable<any, any>(或<string, any>的事实)。

我喜欢底层类型来指示我的实体的类型,因此更清楚的是返回给服务的消费者是什么,并且可以更好地实施。

有没有更好的方法来编写此方法,以便它符合我上面描述的标准,但也指出基础类型?

更新

所以我改变了这个以返回我想要的类型,但似乎非常涉及这种方式:

getEntityById = (id: number | string): Observable<MyEntity> => {
    const subscription = this.http.get(`${this.baseUrl}/${id}`)
        .map((response: Response) => Immutable.fromJS(this.helper.getResponseAsJson(response)))
        .share() 
        .subscribe(result => {
            this.entitySubject.next(result);

            subscription.unsubscribe();
        }, err => {
            this.logger.error(this.helper.parseError(err));

            this.entitySubject.error(err);

            subscription.unsubscribe();
        });

    return this.entitySubject.map((immutable: Immutable.Iterable<any, any>) => immutable.toJS());
}

我觉得必须有一种更简单的方法来实现这一点。

1 个答案:

答案 0 :(得分:0)

我不明白为什么你在这里做.map?我假设你只有一个回应?如果是这样,请返回Immutable.fromJS(this.helper.getResponseAsJson(response))) 在Immutable中还有toList()toMap()函数可用于将iterable转换为另一种类型(List或Map)。