У меня есть служба angular, которая получает данные от API, и эти данные используются во многих компонентах, поэтому вызов API для получения одних и тех же данных каждый раз является пустой тратой.
Так что япошел вперед и попытался использовать объекты поведения для хранения данных.Я работал хорошо до некоторой степени, используя это так:
Сервис :
books = new BehaviorSubject<Book[]>(null);
setBooks(book: Book[]) {
this.books.next(book);
}
getBooks() {
this.http.get(...).do(
(res) => {
this.setBooks(res.books);
}
);
}
Компоненты:
ngOnInit() {
this.booksService.books.subscribe(
(books) => {
// in case the api was never called
if (books == null) {
return this.booksService.getBooks().subscribe();
}
console.log(books);
// ...
}
);
}
Работает нормально, когда есть книги, но если книги представляют собой пустой массив (что является одним из ожидаемых вариантов поведения), программа застревает в цикле, вызывая API навсегда.Тестируя его, я понял, что он застревает в части .do () в служебном вызове, но я понятия не имею, почему.
Я прочитал здесь BehaviorSubject не предназначен для использования с нулемначальное значение, но, как предложил @estus, при использовании ReplaySubject (1) происходит то же самое.
Интересно, есть ли «правильный» способ хранения данных, подобный этому.Я также не думаю, что использование localstorage является лучшим решением, так как это может быть большой объем данных, и он сильно меняется по мере использования приложения.