Использование NgZone с подпиской rxjs

#angular #asynchronous #rxjs #zone

#angular #асинхронный #rxjs #зона

Вопрос:

Внутри моей функции getNext() я заполняю переменные асинхронно с помощью функции subscrybing observable. Когда переменная заполнена, я хочу вызвать функцию next() моего ViewChild компонента ngslCarousel , которая использует переменные внутри логики html. Я не знаю почему, но этот метод не работает.

 this.pages.getNext()
          .subscribe((page: IListItemsPage<Ads>) => {
              this.zone.run(() => {
                this.pages.push(page);
                this.ads = page.items;
                this.hasNext = page.hasNext;
                this.hasPrev = true;
                this.index  ;
                this.adsCount = this.adsCount - page.items.length;
                this.ngslCarousel.next();
              });
            });
  

pages , ads являются глобальными переменными, которые используются this.ngslCarousel.next();

Чтобы заметить, если я использую setTimeout() , все работает неплохо, но это решение выглядит неправильно.

 setTimeout(() => {
              this.ngslCarousel.next();
            }, 250);
  

Комментарии:

1. Есть ли у ваших компонентов OnPush стратегия обнаружения изменений?

2. @xyz Нет, я бы скорее сказал, что это стратегия обнаружения изменений по умолчанию.

3. Все подписки на RxJS должны регистрироваться в зоне автоматически. Работает ли это, если вы удалите this.zone.run ?

4. @Pace Нет, только если я использую setTimeout

5. Вы подтвердили, что подписка действительно запускается несколько раз? Например, угловые HTTP-вызовы будут запускаться один раз, а затем завершаться. Я не вижу никаких вызовов interval или чего-либо очевидного, что означало getNext() бы повторение каждые 250 мс