2016-11-18 14 views
0

ReactiveXの原理は比較的新しいですが、私はこれまでに学んだことの大ファンです。私はちょっと考えましたが、もっと経験豊かな意見を出したいと思います。連鎖したrxjs観測可能なオペレータ

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(); 
    } 

私は、マップを利用したいキャッチし、publishReplay、参照カウント、シェア事業者や自分のオペレータに入れて、そのような私がいることだろう

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 

答えて

0

次のようなことができますか? bind()を使用すると、http呼び出しの実行を延期できます。 Observableが(ほとんどの場合)遅延しており、サブスクライブするまでコードを実行しないため、http.get()がObservableを返す場合は、それを呼び出して返されるobservableをhandleHttpCallに渡すことができます。

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(); 
} 
+0

マーク、ありがとう。これは実際に私が今やっていることです。私は、http.get()呼び出しの最後に演算子を追加するだけの "反応的な"対処方法があるかどうかはわかりませんでした。 http://www.get()はobservableを返します。 –

+0

あなたのhttp.get()がobservableを返すので、あなたはbind()をスキップすることができます。プロビジョニングを観測可能に変換するより反応的な方法は、 'Rx.Observable.defer(()=> this.http.get(endpoint、requestOptions))' –

関連する問題