角组件调用服务调用服务:两者都需要对结果做些事

时间:2019-06-27 20:54:21

标签: angular rxjs observable subject

我不确定如何表达这个问题。

我有一个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
    });
}

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

我尝试过的事情:

  1. 让服务方法doSomethingInService()返回一个observable而不是void那样,我可以同时响应成功和错误情况。问题:如果它只是返回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()返回一个可观察到的,但不是从httpService的doGet()方法返回的。因此,service方法仍然可以预订httpService的doGet()observable,并对其结果进行处理,但是由于它本身返回一个observable,因此组件可以对其进行预订,并对该结果进行处理。我只是不知道该如何编码。

  2. 让httpService的doGet()方法不返回可观察的对象,而是返回一个Subject。然后,我可以连接两个观察者:(1)调用它的doSomething()方法,以及(2)组件。再说一次,我只是不知道该如何连接。同样,执行顺序很重要。角度服务的doSomething()方法必须首先处理结果,然后组件的doSomethingInService()才能执行此操作。

我知道可能已经回答了这个问题,但是我对rxjs还是陌生的,所以我不知道如何写查询字。

1 个答案:

答案 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 */);
}

documentation

  

点击

     

透明地执行操作或副作用,例如记录

如果您希望在将结果返回给组件/用户之前进行转换,则可以使用map

边注 我不确定doGet是什么。只需在HttpClient上使用get<T>