优化Typescript(或JavaScript)函数/方法,以减少使用Observable时的重复

时间:2016-06-27 11:50:04

标签: javascript typescript rxjs

我有一个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的新手。

2 个答案:

答案 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;
}