我不确定如何表达这个问题。
我有一个Angular组件,需要在服务类上调用方法。该方法需要通过我自己的http服务调用http方法,然后对结果进行处理。
但是随后组件还需要做一些响应服务调用的事情。所以我有类似以下的伪代码:
在组件中:
public doSomethingInService(payload: any): void {
this.myService.doSomething(payload);
// I also need to do something with the result!
}
在使用中:
public doSomething(payload: any): void {
this._httpService.doGet(url).subscibe((result) => {
// do something with the result
});
}
好的,现在该组件再也没有机会做它的事情了。
我尝试过的事情:
public doSomething(payload: any): Observable<any>{
return this._httpService.doGet(url);
// I never get a chance to react the doGet result
}
...然后,该服务的doSomethingInService()方法将永远没有机会对结果进行处理。
让服务调用doSomething()返回一个可观察到的,但不是从httpService的doGet()方法返回的。因此,service方法仍然可以预订httpService的doGet()observable,并对其结果进行处理,但是由于它本身返回一个observable,因此组件可以对其进行预订,并对该结果进行处理。我只是不知道该如何编码。
让httpService的doGet()方法不返回可观察的对象,而是返回一个Subject。然后,我可以连接两个观察者:(1)调用它的doSomething()方法,以及(2)组件。再说一次,我只是不知道该如何连接。同样,执行顺序很重要。角度服务的doSomething()方法必须首先处理结果,然后组件的doSomethingInService()才能执行此操作。
我知道可能已经回答了这个问题,但是我对rxjs还是陌生的,所以我不知道如何写查询字。
答案 0 :(得分:4)
这可以通过使用tap
并从服务中返回可观察对象来实现。
service.ts
public doSomething(payload: any): Observable<TypeHere> {
return this._httpService.doGet(url).pipe(tap((result) => {
// do something with the result
}));
}
component.ts
public doSomethingInService(payload: any): void {
this.myService.doSomething(payload).subscribe(_ => /* do something */);
}
点击
透明地执行操作或副作用,例如记录
如果您希望在将结果返回给组件/用户之前进行转换,则可以使用map
。
边注
我不确定doGet
是什么。只需在HttpClient
上使用get<T>
。