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

好的,现在组件再也没有机会做它的事了。

我尝试过的事情:

  1. 使服务方法 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() 方法永远不会有机会用结果做它的事情。

  1. 让服务调用 doSomething() return 一个可观察的,但不是来自 httpService 的 doGet() 方法的那个。所以服务方法仍然可以订阅 httpService 的 doGet() 可观察对象,并对结果做一些事情,但是因为它本身 return 是一个可观察对象,组件可以订阅它,并对结果做自己的事情.我只是不知道如何编写代码。

    1. 让 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 */);
}

来自documentation

Tap

Transparently perform actions or side-effects, such as logging

如果您希望在将结果返回到 component/subscriber 之前转换结果,您可以改用 map

旁注 我不确定 doGet 是什么。只需在 HttpClient.

上使用 get<T>