У меня есть проект на Ionic5, который запрашивает некоторые элементы API. У меня есть код, аналогичный приведенному ниже:
Item.service.ts
getItens(): Observable<Item[]> {
const subject = new Subject<Item[]>();
this.http.get<Response>('host').subscribe(data => {
// Some cool things
subject.next(data.items)
}, error => {
subject.error(error.message)
});
return subject.asObservable();
}
items.page.ts
items: Item[] = [];
loadItems() {
this.itemService.getItems().subscribe(items => this.items = items);
}
На странице у меня есть интервал обновления элементов. Все работает нормально, если я использую this.items = items
, но список исчезает и появляется снова при каждой загрузке, вероятно, потому что все значение this.items
изменяется
Поэтому я попытался просто вставить разные значения в массив:
items: Item[] = [];
loadItems() {
this.itemService.getItems().subscribe(items => {
items.forEach(item => {
const value = this.items.find(i => i.id == item.id);
if(!value) this.items.unshift(item);
})
})
}
К сожалению, субъект не ожидает результатов от службы, поэтому на странице отображается пустой массив. Уродливое решение, которое я нашел, заключалось в использовании тайм-аута для ожидания результатов, но мс должно изменяться в зависимости от длины списка элементов. Наблюдение состоит в том, что если я регистрирую элементы из item.page.ts , он будет печатать массив с длиной 0, но со значениями
введите описание изображения здесь
Я бы хотел избежать самих обещаний и сохранить Observables, если это возможно.
Я не могу вернуть запрос напрямую, потому что мне нужно манипулировать данными.
Есть ли любой способ ждать subject.next()
для рендеринга элементов? Если нет, то какой logi c я могу использовать для отображения списка элементов?
SOLVED
Проблема была решена с использованием спецификации c logi c проекта. Но все ответы ниже будут работать в обычных средах и содержат много информации в комментариях. Я очень рекомендую прочитать их все.