#angular #typescript #rxjs #observable
#angular #typescript #rxjs #наблюдаемый
Вопрос:
Я пытаюсь объединить оба этих вызова в один, чтобы они вызывались асинхронно или последовательно. Я думаю, мне нужно использовать, map или switchMap.
ImageType — это перечисление.
Он должен возвращаться как строковый uri.
перечисление
export enum ImageType {
Avatar = 1,
Cover = 2
}
component.ts
this.service.getphotos(ImageType.Avatar, this.id).subscribe(result => {
this.avatarPhotos = resu<
});
this.service.getphotos(ImageType.Cover, this.id).subscribe(result => {
this.coverPhotos = resu<
});
service.ts
getPhotos(imageType: ImageType, id: number): Observable<string[]> {
return this.http.get<string[]>(`api/getphotos/${imageType}/${id}`);
}
Комментарии:
1. Вы можете использовать combineLatest
2. Ответ будет отличаться в зависимости от того, что вы хотите, чтобы произошло, если один из вызовов завершится неудачно. Каково ожидаемое поведение?
3. Я об этом не подумал. В настоящее время, если изображение недоступно, у меня есть изображение по умолчанию, которое реализовано onError в <IMG> . Если один вызов завершается с ошибкой, я бы хотел, чтобы это было ошибкой (я удалил ошибку для удобства чтения).
4. Спасибо, я посмотрю combineLatest
Ответ №1:
Простое решение здесь:
combineLatest([
this.service.getphotos(ImageType.Avatar, this.id).pipe(
tap(result => (this.avatarPhotos = result)),
),
this.service.getphotos(ImageType.Cover, this.id).pipe(
tap(result => (this.coverPhotos = result)),
)
]).subscribe()
Вы можете сделать это с forkJoin
помощью любого из них.
Комментарии:
1. Я думаю, что это должно быть «tap (result=> (this.avatarPhotos = result))», поэтому, пожалуйста, отредактируйте, если это так. Я пометил это как правильный ответ. Спасибо за помощь. Я потрачу сегодняшний день на RxJS!
2. @Robgit28 Да, спасибо!
3. На самом деле это не очень хорошая практика в примере, только если свойства нет в шаблоне. Если это в шаблоне, просто используйте
async
вместо этого канал.