我在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());
}
我觉得必须有一种更简单的方法来实现这一点。
答案 0 :(得分:0)
我不明白为什么你在这里做.map
?我假设你只有一个回应?如果是这样,请返回Immutable.fromJS(this.helper.getResponseAsJson(response)))
在Immutable中还有toList()
和toMap()
函数可用于将iterable转换为另一种类型(List或Map)。