@waltaki

Rxjs — как сделать двойной subscribe?

Здравствуйте.

Подскажите как такое реализовать:
let get = () => {
    return this.http.get(url)
        .subscribe((responce: ResponceObject) => {...});
}

get()
    .subscribe((responce: ResponceObject) => {...});

Нужно это в сервисе. С обычными callback уже реализовал, но всё же, вдруг есть что-то по лучше в даном случае. flatmap понять не смог. Подскажите, пожалуйста, в каком направление смотреть или не смотреть.
Желательно, конечно, с примером кода))
  • Вопрос задан
  • 203 просмотра
Решения вопроса 1
search
@search
мама говорит что я особенный
Обзёрвер не выполняет никакой работы до тех пор пока не была вызвана функция 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы