Я не уверен, как сформулировать этот вопрос.
У меня есть компонент 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() возвращал наблюдаемое, но не тот, который из метода doGet() httpService. Таким образом, сервисный метод по-прежнему может подписываться на наблюдаемый объект httpService doGet() и что-то делать с результатом, но поскольку он сам возвращает наблюдаемый объект, компонент может подписаться на него и делать с результатом свои собственные действия. Я просто понятия не имею, как это закодировать.
Я знаю, что на этот вопрос, вероятно, уже был дан ответ, но я настолько новичок в rxjs, что не могу понять, как сформулировать запрос.
Спасибо.





Это можно сделать с помощью tap и возврата наблюдаемого из службы.
сервис.тс
public doSomething(payload: any): Observable<TypeHere> {
return this._httpService.doGet(url).pipe(tap((result) => {
// do something with the result
}));
}
компонент.ts
public doSomethingInService(payload: any): void {
this.myService.doSomething(payload).subscribe(_ => /* do something */);
}
Из документация
Tap
Transparently perform actions or side-effects, such as logging
Если вы предпочитаете преобразовать результат перед возвратом его компоненту/подписчику, вы можете вместо этого использовать map.
Примечание
Я не уверен, что такое doGet. Просто используйте get<T> на HttpClient.
Да, это было то, что мне было нужно. Спасибо. теперь будет читать на оператор крана.