Typescript 如何将相同的方法链接到多个观测值?

Typescript 如何将相同的方法链接到多个观测值?,typescript,rxjs,observable,Typescript,Rxjs,Observable,假设我有以下服务,使用以下方法进行一些API调用: class MyService { constructor(protected http: HttpClient) { } getItems() { return this.http .get(`/api/items`) .catch(this.handleError) .finally(() => { return; });

假设我有以下服务,使用以下方法进行一些API调用:

class MyService {
    constructor(protected http: HttpClient) { } 

    getItems() {
        return this.http
            .get(`/api/items`)
            .catch(this.handleError)
            .finally(() => { return; });
    }

    getItem(id: string) {
        return this.http
            .get(`/api/items/${id}`)
            .catch(this.handleError)
            .finally(() => { return; });
    }

    addItem(item: Object) {
        return this.http
            .post(`/api/items`, JSON.stringify(item))
            .catch(this.handleError)
            .finally(() => { return; });
    }

    editItem(id: string, item: Object) {
        return this.http
            .put(`/api/items/${id}`, JSON.stringify(item))
            .catch(this.handleError)
            .finally(() => { return; });
    }

    private handleError(err: any) {
        console.error(err);
    }
}
注意我如何在多个地方重复相同的
.catch(…)
。最后(…)
行代码。我希望将这些方法链接到一个位置,以减少代码重复

这是我到目前为止所做的,但它破坏了链接的可读性。在我看来,可能有另一种方法可以做到这一点,并且仍然保持链接的顺序。说到可观察的东西,我还是个新手

class MyService {
    constructor(protected http: HttpClient) { } 

    getItems() {
        return this.applyExtras(this.http.get(`/api/items`));
    }

    getItem(id: string) {
        return this.applyExtras(this.http.get(`/api/items/${id}`));
    }

    addItem(item: Object) {
        return this.applyExtras(this.http.post(`/api/items`, JSON.stringify(item)));
    }

    editItem(id: string, item: Object) {
        return this.applyExtras(this.http.put(`/api/items/${id}`, JSON.stringify(item)));
    }

    private applyExtras(obs: Observable<any>): Observable<any> {
        return obs
            .catch(this.handleError)
            .finally(() => { return; });
    }

    private handleError(err: any) {
        console.error(err);
    }
}
classmyservice{
构造函数(受保护的http:HttpClient){}
getItems(){
返回this.applyExtras(this.http.get(`/api/items`));
}
getItem(id:string){
返回this.applyExtras(this.http.get(`/api/items/${id}`));
}
附加项(项目:对象){
返回this.applyExtras(this.http.post(`/api/items`,JSON.stringify(item));
}
editItem(id:字符串,item:对象){
返回this.applyExtras(this.http.put(`/api/items/${id}`,JSON.stringify(item));
}
私有applyExtras(obs:可观察):可观察{
返回obs
.接住(这个.把手错误)
.finally(()=>{return;});
}
私有句柄错误(错误:任意){
控制台错误(err);
}
}

如果您至少使用RxJS 5.5.0,那么您可以使用
可管道的
操作符来共享普通操作符的管道

class MyService {
    constructor(protected http: HttpClient) { } 

    private withErrorHandler: any = [
      catchError(this.handleError),
      finalize(() => {})
    ]

    getItems() {
        return this.http
            .get(`/api/items`)
            .pipe(...withErrorHandler)
    }
}
或者,如果您不想使用pipeable语法,或者您有RxJS的早期版本,那么您可以使用
let

private withErrorHandler: any = (source) => 
  source.catch(this.handleError).finally(() => {})

getItems() {
  return this.http
     .get(`/api/items`)
     .let(withErrorHandler)
}

另一个选择是,如果订阅只在一个位置使用,则只处理订阅上的错误/终结。是的,谢谢,我没有说明,但这正是我试图重构的内容。我们有几十个服务,它们的方法上几乎都有相同的
catch
finally
操作符,我试图将它们移动到一个基类中,在这个基类中我只需要在一个位置添加它们。但你是对的,那也行。因为我最初问了这个问题,我们升级了我们的项目,需要更新版本的RxJS,我们现有的所有可观察链都转换成管道。是的,现在做这种事很容易。而且,看起来我要找的正是
let
。永远不会从名字中得到这些。