gpt4 book ai didi

Angular 组件调用调用服务 : both need to do something with result 的服务

转载 作者:太空狗 更新时间:2023-10-29 17:50:55 24 4
gpt4 key购买 nike

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

我有一个 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() 方法的对象。所以服务方法仍然可以订阅 httpService 的 doGet() observable,并对结果做一些事情,但是因为它本身返回一个 observable,组件可以订阅它,并对结果做自己的事情。我只是不知道如何编写代码。

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

我知道这可能已经得到了回答,但我对 rxjs 太陌生了,我不知道如何表达查询。

谢谢。

最佳答案

这可以使用 tap 来完成并从服务中返回 observable。

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

如果您希望在将结果返回给组件/订阅者之前转换结果,您可以使用 map 相反。

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

关于Angular 组件调用调用服务 : both need to do something with result 的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com