#rxjs #angular11 #angular-akita #akita
Вопрос:
Я новичок в Угловом с Акитой.
У меня есть приложение, в котором пользователи загружаются и устанавливаются в магазине. у всех пользователей начальное свойство ImageUrl имеет значение, например: ‘http://testxxxxxx» Компонент запрашивает хранилище для всех пользователей и по каналу вызывает метод, который проходит через каждого пользователя, выполняет вызов api, чтобы получить ответ на изображение «большого двоичного объекта» от api, и обновляет хранилище с помощью ImageUrl человека = «большой двоичный объект:http:2fk2fjadkf», и компонент устанавливает
Но по какой-то причине метод внутри внешнего наблюдаемого повторяется много раз. не знаю почему.
Вот мой код:
Компонент:
peopleToShow$ = this.peopleFacade.peopleToShow$;
Component.html использует peopleToShow$ и свойство ImageUrl каждого человека. Прямо сейчас он не принимает обновленный URL-адрес большого двоичного объекта, заданный в блоках this.loadimagesas
Фасад:
peopleToShow$ = this.peopleQuery.peopleToShow$
.pipe(
tap((people) => this.loadImagesAsBlobs(people))
);
private loadImagesAsBlobs(people: Person[]) {
people.forEach((person) => {
if (!person.isUrlChecked) {
this.imageDataService
.getAndStoreImageOnClient(person.imageUrl)
.pipe(
take(1),
switchMap((safeUrl) => {
this.updatePersonWithBlobImageUrl(person.id, safeUrl);
return EMPTY;
}),
catchError(() => {
this.updatePersonWithBlobImageUrl(person.id, null);
return EMPTY;
})
)
.subscribe();
}
});
}
private updatePersonWithBlobImageUrl(id: number, blobUrl: SafeUrl) {
this.peopleStore.updatePersonWithBlobImageUrl(id, blobUrl as string);
}
Спасибо
Ответ №1:
Это не входит в этот код, но когда у меня возникла эта проблема, это было связано с тем, что у меня было несколько вещей, прослушивающих одну наблюдаемую, что означает, что все это происходило несколько раз.
Чтобы исправить, измените
peopleToShow$ = this.peopleQuery.peopleToShow$
.pipe(
tap((people) => this.loadImagesAsBlobs(people))
);
Для
peopleToShow$ = this.peopleQuery.peopleToShow$
.pipe(
tap((people) => this.loadImagesAsBlobs(people)),
share()
);
или используйте shareReplay(1)
вместо этого, если вы беспокоитесь о том, что люди будут показывать$, прежде чем все будет настроено ниже по течению.