#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 мс