Компонент Angular вызывает службу, которая вызывает службу: оба должны что-то сделать с результатом

Я не уверен, как сформулировать этот вопрос.

У меня есть компонент 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() возвращал наблюдаемое вместо пустоты. Таким образом, я могу реагировать как на условия успеха, так и на ошибки. Проблема: если он просто возвращает наблюдаемое, которое дает мне метод doGet() httpService:

public doSomething(payload: any): Observable<any>{
    return this._httpService.doGet(url);
    // I never get a chance to react the doGet result
}

...тогда у метода doSomethingInService() службы никогда не будет возможности сделать что-то с результатом.

  1. Сделайте так, чтобы сервисный вызов doSomething() возвращал наблюдаемое, но не тот, который из метода doGet() httpService. Таким образом, сервисный метод по-прежнему может подписываться на наблюдаемый объект httpService doGet() и что-то делать с результатом, но поскольку он сам возвращает наблюдаемый объект, компонент может подписаться на него и делать с результатом свои собственные действия. Я просто понятия не имею, как это закодировать.

    1. Пусть метод httpService doGet() возвращает не наблюдаемое, а субъект. Затем я мог подключить двух наблюдателей: (1) вызывающий метод doSomething() и (2) компонент. Опять же, я просто не могу понять, как подключить это. Также важен порядок выполнения. Метод угловой службы doSomething() должен сначала выполнить свою работу с результатом, после чего можно будет использовать метод doSomethingInService() компонента.

Я знаю, что на этот вопрос, вероятно, уже был дан ответ, но я настолько новичок в rxjs, что не могу понять, как сформулировать запрос.

Спасибо.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
4
0
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это можно сделать с помощью 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.

Да, это было то, что мне было нужно. Спасибо. теперь будет читать на оператор крана.

FunkMonkey33 28.06.2019 00:32

Другие вопросы по теме