Внутренняя наблюдаемая не обновляется

#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.