#rxjs #rxjs-observables
#rxjs #rxjs-наблюдаемые
Вопрос:
Я использую rxjs для извлечения владельцев регистраций и связанных с ними сервисов и образа сервиса, однако, когда служба get обновляется, это не отражается в моем наблюдаемом?
Может кто-нибудь выяснить, почему, что я делаю не так?
Я должен продолжать писать материал, потому что stackoverflow не позволит мне публиковать, если я не запишу избыточную, лишнюю информацию для чтения читателем.
that._registrantsSubscription = that.userForumRegistrantService.getRegistrants(forum.uid, forum.forumId)
.switchMap(registrants => {
if (registrants amp;amp; registrants.length > 0) {
let observables = registrants.map(registrant => {
let getService$ = that.userServiceService.getService(registrant.uid, registrant.serviceId);
let getDefaultServiceImages$ = that.userServiceImageService.getDefaultServiceImages(registrant.uid, registrant.serviceId);
return combineLatest(getService$, getDefaultServiceImages$)
.switchMap(results => {
const [service, defaultServiceImages] = results;
if (service){
if (defaultServiceImages amp;amp; defaultServiceImages.length > 0)
service.defaultServiceImage = of(defaultServiceImages[0]);
else {
let tempImage = {
tinyUrl: '../../../assets/defaultTiny.jpg',
name: 'No image'
};
service.defaultServiceImage = of(tempImage);
}
return of(service);
}
else return of(null);
}
);
});
return zip(...observables, (...results) => {
return results.map((result, i) => {
if (result)
registrants[i].service = of(result);
else
registrants[i].service = of(null);
return registrants[i];
});
});
}
else
return of([]);
})
.subscribe(registrants => {
that.registrants = of(registrants);
}
);
public getRegistrants(parentUserId: string, forumId: string): Observable<any[]> {
return this.afs.collection<any>(`users/${parentUserId}/forums/${forumId}/registrants`, ref => ref.orderBy('creationDate', 'desc')).valueChanges();
}
public getService (parentUserId: string, serviceId: string): Observable<any> {
return this.afs.collection(`users/${parentUserId}/services`).doc(serviceId).valueChanges();
}
public getDefaultServiceImages (parentUserId: string, serviceId: string): Observable<any> {
return this.afs.collection<any>(`users/${parentUserId}/services/${serviceId}/images`, ref => ref.where('default', '==', true).limit(1)).valueChanges();
}
Комментарии:
1. Рассматривали ли вы возможность использования iif вместо switchMap, возвращающего несколько наблюдаемых? learnrxjs.io/learn-rxjs/operators/conditional/iif
2. Привет, Адриан, я просмотрел iif, но я не уверен, как мне следует реализовать это в моем случае? Можете ли вы привести мне краткий пример того, что вы имеете в виду, и я попробую!
Ответ №1:
Я изменил этот фрагмент кода:
return zip(...observables, (...results) => {
return results.map((result, i) => {
if (result)
registrants[i].service = of(result);
else
registrants[i].service = of(null);
return registrants[i];
});
});
К этому:
return combineLatest(...observables, (...results) => {
return results.map((result, i) => {
if (result)
registrants[i].service = of(result);
else
registrants[i].service = of(null);
return registrants[i];
});
});
И теперь это работает!
Не знаю почему, но мне все еще нужно усердно изучать rxjs.