Angular Component вызывает сервис, который вызывает сервис: оба должны что-то делать с результатом - PullRequest
4 голосов
/ 27 июня 2019

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

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

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

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

1 Ответ

4 голосов
/ 28 июня 2019

Это можно сделать, используя 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 */);
}

Из документации

Нажмите

Прозрачно выполнять действия или побочные эффекты, такие как регистрация

Если вы предпочитаете преобразовать результат перед возвратом его компоненту / подписчику, вы можете использовать map вместо этого.

примечание Я не уверен, что такое doGet. Просто используйте get<T> на HttpClient.

...