Обзёрвер не выполняет никакой работы до тех пор пока не была вызвана функция subscribe. Сам процесс вызова subscribe называется "подписка". Как только функция subscribe была вызвана (т.е. на обзёрвер подписались) - дело пошло и обзёрвер начал свою работу. До тех пор пока subscribe не вызван, обзёрвер - это просто рецепт того что нужно делать когда прийдут данные.
Сама функция subscribe возвращает деструктор. Деструктор - это что-то что нужно выполнить, если вдруг понадобилось остановить обсёрвер (например прервать HttpConnection).
Код ниже возвращает функцию-деструктор
let get = () => {
return this.http.get(url)
.subscribe((response: ResponseObject) => {...});
}
На функцию-деструктор невозможно подписаться. Коллбеков у неё тоже нет. Её можно только выполнить для того чтоб остановить обзёрвер.
Поэтому, универсальный рецепт - это никогда не подписываться в самих сервисах. Если вам нужно что-то проделать с данными из обзёрвера в самом сервисе, то можно воcпользоваться оператором tap:
let get = () => {
return this.http.get(url)
.pipe(
tap((response: ResponseObject) => {...})
);
}
// а дальше где-то в коде сделать
service.get().subscribe((response: ResponseObject) => {...})
Более того, вы можете делать tap (и любой друго pipe оператор) пока у вас есть обзёрвбл:
service.get()
.pipe(
tap(...),
map(...),
whatever(...),
).subscribe((response: ResponseObject) => {...})
Вам будет проще понять механизм работы обзёрвблов, если вы будите рассматривать обзёрвбл как функцию, а метод subscribe как способ выполнить эту функцию.
Учитывая вышесказанное:
const observable = service.get();
observable.subscribe((result) => {...}); //выполнит запрос к серверу
observable.subscribe((result) => {...}); //выполнит запрос к серверу еще раз
// запрос к серверу будет инициироваться каждый раз когда будет выполняться функция subscribe