我有一个TypeScript服务来确定应用程序成员和金牌成员之间的关系。在我的服务/课程中,我有两种方法:
public getMembers():Observable<MembersListings> {
return this.http.get(this.url)
.map((response:Response) => response.json())
.publishReplay(1)
.refCount();
}
public getPremiumMembers():Observable<MembersListings> {
return this.http.get(this.url)
.map((response:Response) => this.formatListings(response.json()))
.publishReplay(1)
.refCount();
}
public formatListings(jsonObj:any):any {
// do something
return jsobObj;
}
然而看着它,我可以在第二种方法this.getMembers()
中调用/使用第一种方法this.getPremiumMembers()
它会使事情变得更清洁,因为它们都做同样的事情,我只是使用第二种方法中的格式化功能,否则它们是相同的。但是,当我尝试在第二种方法中将this.http.get(this.url)
替换为this.getMembers()
时,我收到了一个可怕的错误。我怎么能达到我想要的正确程度?对于这样一个愚蠢的问题,我很抱歉,但我是TS / RxJS的新手。
答案 0 :(得分:0)
看起来getMembers()
和getPremiumMembers()
之间的唯一区别是getPremiumMembers()
必须做一些副作用(formatListings)。如果是这种情况,我建议合并它们:
public getMembers(premium: boolean):Observable<MembersListings> {
return this.http.get(this.url)
.map((response:Response) => response.json())
.do(premium ? this.formatListings.bind(this) : void 0)
.publishReplay(1)
.refCount();
}
如果formatListings中的do something
在返回之前修改了jsonObj,请将.do(premium ? this.formatListings.bind(this) : void 0)
替换为.map(json => (premium ? this.formatListings(json) : json))
答案 1 :(得分:0)
您可以更新获取请求,以获取更通用的格式化程序:
public getMembers(isPremium: boolean):Observable<MembersListings> {
return this.http.get(this.url)
.map((response:Response) => this.formatListings(response.json(), isPremium))
.publishReplay(1)
.refCount();
}
如果他们是高级会员,那只会操纵json:
private formatListings(jsonObj:any, isPremium: boolean):any {
if (!isPremium) {
// not a premium member, return it;
return jsonObj;
}
// do stuff to manipulate premium members
return jsobObj;
}