链式rxjs Observable运算符

时间:2016-11-18 13:46:30

标签: rxjs observable reactivex

我对ReactiveX原则相对较新,但到目前为止,我是我所学习的忠实粉丝。我有一个挑战,我已经考虑了一些,但我希望得到一个更有经验的意见:

我有几个返回Observable的方法。每一个都在类似的庄园中创建一个Observable,然后链接相同的精确运算符。有没有办法抽象那些操作员,这样我就不必每个方法都重复这个代码。

例如,这就是我现在所拥有的:

    public get(endpoint: string, options?: RequestOptions): Observable<any> {
      return this.http.get(endpoint, requestOptions)
        .map((response: Response) => {
          let responseBody = response.json();
          return responseBody;
        })
        .catch((error: Response) => {
            let responseError = new ErrorResponse(error.status.toString(), error.json());
            return Observable.throw(responseError);
        })
        .publishReplay()
        .refCount()
        .share();
    }

    public put(endpoint: string, body: any, options?: RequestOptions): Observable<any> {
      return this.http.put(endpoint, body, requestOptions)
        .map((response: Response) => {
          let responseBody = response.json();
          return responseBody;
        })
        .catch((error: any) => {
          this.logger.logRequestError('PUT', endpoint, error);
          return Observable.throw(error);
        })
        .publishReplay()
        .refCount()
        .share();
    }

我想把地图,catch,publishReplay,refCount,共享运算符放在他们自己的运算符中,这样我就可以这样做:

    public get(endpoint: string, options?: RequestOptions): Observable<any> {
      return this.http.get(endpoint, requestOptions).myOperator();
    }

    public put(endpoint: string, body: any, options?: RequestOptions): Observable<any> {
      return this.http.put(endpoint, body, requestOptions).myOperator();
    }

    // define myOperator as something like:

        .map((response: Response) => {
          let responseBody = response.json();
          return responseBody;
        })
        .catch((error: Response) => {
            let responseError = new ErrorResponse(error.status.toString(), error.json());
            return Observable.throw(responseError);
        })
        .publishReplay()
        .refCount()
        .share();

    // end definition

1 个答案:

答案 0 :(得分:0)

这样的事情对你有用吗?使用bind(),您可以推迟执行http调用。我不知道您正在使用哪个库,如果http.get()返回一个Observable,那么您可以调用它并将返回的observable传递给handleHttpCall,因为Observable(几乎总是)是惰性的并且不会运行代码直到订阅。

public get(endpoint:string, options?: RequestOptions): Observable<any> {
  return handleHttpCall(this.http.get.bind(endpoint, requestOptions));
}

private handleHttpCall(httpAction) {
  return httpAction()
       .map((response: Response) => {
          let responseBody = response.json();
          return responseBody;
        })
        .catch((error: Response) => {
            let responseError = new ErrorResponse(error.status.toString(), error.json());
            return Observable.throw(responseError);
        })
        .publishReplay()
        .refCount()
        .share();
}