Angular 组件调用调用服务的服务:两者都需要对结果做一些事情
Angular Component calls Service that calls service: both need to do something with result
我不知道如何表达这个问题。
我有一个 Angular 组件需要调用服务 class 上的方法。该方法需要通过我自己的 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
});
}
好的,现在组件再也没有机会做它的事了。
我尝试过的事情:
- 使服务方法 doSomethingInService() return 成为可观察对象而不是 void 这样我就可以响应成功和错误条件。问题:如果只是 return 是 httpService 的 doGet() 方法给我的可观察对象:
public doSomething(payload: any): Observable<any>{
return this._httpService.doGet(url);
// I never get a chance to react the doGet result
}
...然后服务的 doSomethingInService() 方法永远不会有机会用结果做它的事情。
让服务调用 doSomething() return 一个可观察的,但不是来自 httpService 的 doGet() 方法的那个。所以服务方法仍然可以订阅 httpService 的 doGet() 可观察对象,并对结果做一些事情,但是因为它本身 return 是一个可观察对象,组件可以订阅它,并对结果做自己的事情.我只是不知道如何编写代码。
- 让 httpService 的 doGet() 方法不是 return 可观察的,而是一个主题。然后我可以连接两个观察者:(1) 调用它的 doSomething() 方法,以及 (2) 组件。再一次,我只是不知道如何连接它。此外,执行顺序也很重要。 angular 服务 doSomething() 方法必须首先对结果做它的事情,然后组件的 doSomethingInService() 可以在这之后进行。
我知道这可能已经得到解答,但我对 rxjs 还很陌生,我不知道如何表达查询。
谢谢。
这可以使用 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 */);
}
Tap
Transparently perform actions or side-effects, such as logging
如果您希望在将结果返回到 component/subscriber 之前转换结果,您可以改用 map
。
旁注
我不确定 doGet
是什么。只需在 HttpClient
.
上使用 get<T>
我不知道如何表达这个问题。
我有一个 Angular 组件需要调用服务 class 上的方法。该方法需要通过我自己的 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
});
}
好的,现在组件再也没有机会做它的事了。
我尝试过的事情:
- 使服务方法 doSomethingInService() return 成为可观察对象而不是 void 这样我就可以响应成功和错误条件。问题:如果只是 return 是 httpService 的 doGet() 方法给我的可观察对象:
public doSomething(payload: any): Observable<any>{
return this._httpService.doGet(url);
// I never get a chance to react the doGet result
}
...然后服务的 doSomethingInService() 方法永远不会有机会用结果做它的事情。
让服务调用 doSomething() return 一个可观察的,但不是来自 httpService 的 doGet() 方法的那个。所以服务方法仍然可以订阅 httpService 的 doGet() 可观察对象,并对结果做一些事情,但是因为它本身 return 是一个可观察对象,组件可以订阅它,并对结果做自己的事情.我只是不知道如何编写代码。
- 让 httpService 的 doGet() 方法不是 return 可观察的,而是一个主题。然后我可以连接两个观察者:(1) 调用它的 doSomething() 方法,以及 (2) 组件。再一次,我只是不知道如何连接它。此外,执行顺序也很重要。 angular 服务 doSomething() 方法必须首先对结果做它的事情,然后组件的 doSomethingInService() 可以在这之后进行。
我知道这可能已经得到解答,但我对 rxjs 还很陌生,我不知道如何表达查询。
谢谢。
这可以使用 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 */);
}
Tap
Transparently perform actions or side-effects, such as logging
如果您希望在将结果返回到 component/subscriber 之前转换结果,您可以改用 map
。
旁注
我不确定 doGet
是什么。只需在 HttpClient
.
get<T>