Я не могу правильно написать код.
Пока что я:
getTender(id: number): Observable<TenderResponse> {
const tender$ = this.get<TenderResponse>('/tenders/' + id);
const images$ = tender$.pipe(mergeMap((tender: TenderResponse): Observable<TenderResponse> => {
return combineLatest(
tender.locations.loading.map(
(location: TenderLocation, index: number) => {
location.not_uploaded_images = from(this.fileService.getCargoImagesAtLocation(location.id));
return location;
}
)
)
}
);
return images$;
}
Идея, что метод должен получить объект (тендер). Когда это загружено - у него есть список местоположений, у каждого местоположения есть идентификатор. Используя эти идентификаторы (для определения местоположения) - я должен получить список изображений. А затем вернуть результат - Тендер с указанием местоположения с изображениями.
В настоящее время этот код не работает из-за несовместимых типов и устареваний
this.fileService.getCargoImagesAtLocation is обещание, поэтому я использую оператор rx js from
для преобразования его в наблюдаемый ..
Результат метода getTender должен иметь тип Observable .
ОБНОВЛЕННЫЙ КОД:
getImages(locationId: number): Observable<NotUploadedImage[]> {
return from(this.fileService.getCargoImagesAtLocation(locationId));
}
getTender(id: number): Observable<TenderResponse> {
return this.get<TenderResponse>('/tenders/' + id).pipe(
mergeMap(
(tender: TenderResponse): Observable<TenderResponse> => {
tender.locations.loading.forEach((location: TenderLocation) => {
location.not_uploaded_images = this.getImages(location.id);
});
return of(tender);
}
)
);
}
Проблема в том, что not_uploaded_images не разрешается, а свойство возвращаемого объекта Tender имеет тип Observable
, но это должен быть тип NotUploadedImages[]
.
Я думаю, это потому, что оператор combineLatest
не используется. Но как только я его использую - я не могу правильно настроить код.
ЗАКЛЮЧИТЕЛЬНЫЙ РЕЗУЛЬТАТ РАБОТЫ:
getImages(locationId: number): Observable<NotUploadedImage[]> {
return from(this.fileService.getCargoImagesAtLocation(locationId));
}
getTender(id: number): Observable<TenderResponse> {
return this.get<TenderResponse>('/tenders/' + id).pipe(
mergeMap((tender: TenderResponse) =>
combineLatest(
tender.locations.loading.map((location: TenderLocation) =>
this.getImages(location.id)
)
).pipe(
map((images: NotUploadedImage[][]) => {
return tender.locations.loading.map(
(location: TenderLocation, index: number): TenderLocation => {
return {
...location,
not_uploaded_images: images[index],
};
}
);
}),
map((locations: TenderLocation[]) => {
tender.locations.loading = locations;
return tender;
})
)
)
);
}