Почему вложенная подписка не хороша? - PullRequest
2 голосов
/ 11 ноября 2019

Я знаю, что следует избегать вложенных подписок и использовать операторы rxjs, но в статьях, которые я нашел по этой проблеме, обычно просто говорится, что вложенные подписки - это плохо, не объясняя, почему (кроме того, что говорят "может вызвать проблемы").

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

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Хорошо, что вы спрашиваете, так как это распространенная проблема.

Рассмотрите что-то вроде

service.cal1().subscribe(val => {
  service.call2(val).subscribe( res => {
    *does things*
  }
}

То, что вы запускаете, это новая подписка (и, следовательно, новый исполняемый канал) длякаждое значение a any, которое излучается Observable, равным call1(). Это может оставить вас с сотнями необработанных Observables и подписок, которые все остаются в памяти на некоторое время.

Вы должны знать, что когда вы несколько раз набираете subscribe() в Observable, ваши подписчики не будут слушатьточно такой же источник, вместо этого все они вызывают новую копию вашего определенного наблюдаемого конвейера.

Как указано в первом примере в Observable Docu

Observable, которое сразу же (синхронно) толкает значения 1, 2, 3 при подписке

Подчеркните мое

Наблюдаемый ничего не делает сам по себе, но начинает весь путь всякий раз, когда подписывается

Вот почему вы пытаетесь использовать что-то вроде switchMap () для перехода на другой вызов, вместо того, чтобы оставить исходную подписку как есть.

1 голос
/ 11 ноября 2019
let sub1, sub2, sub3, sub4;
sub1 = service.call1().subscribe(result1 => {
  sub2 = service.call2(result1).subscribe(result2 => {
    sub3 = service.call3(result2).subscribe(result3 => {
      sub4 = service.call4(result3).subscribe(result4 => {
        // Do stuff with result 4
      });
    });
  });
});

против

let sub = service.call1().pipe(
  switchMap(result1 => service.call2(result1)),
  switchMap(result2 => service.call3(result2)),
  switchMap(result3 => service.call4(result3)),
  switchMap(result4 => service.call5(result4))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...