我对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
答案 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();
}