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

Я использую rxjs для получения владельцев регистраций и связанного с ними сервиса и образа сервиса, однако, когда сервис обновляется, он не отражается в моем наблюдаемом?

Может кто-нибудь понять, почему, что я делаю неправильно?

Я должен продолжать писать материал, потому что stackoverflow не позволит мне публиковать, если я не запишу избыточную, лишнюю информацию для чтения читателем.

that._registrantsSubscription = that.userForumRegistrantService.getRegistrants(forum.uid, forum.forumId)
  .switchMap(registrants => {
    if (registrants && 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 && 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();
}

person PazoozaTest Pazman    schedule 24.08.2020    source источник
comment
Вы смотрели на использование iif вместо switchMap, возвращающего несколько наблюдаемых? learnrxjs.io/learn-rxjs/operators/conditional/iif   -  person Adrian Brand    schedule 24.08.2020
comment
Привет, Адриан, я посмотрел на iif, но я не уверен, как мне реализовать его в моем случае? Можете ли вы дать мне быстрый пример того, что вы имеете в виду, и я попробую!   -  person PazoozaTest Pazman    schedule 24.08.2020


Ответы (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.

person PazoozaTest Pazman    schedule 24.08.2020