Цикл подписок внутри подписки? - PullRequest
0 голосов
/ 13 мая 2019

В настоящее время я борюсь с множественной / forEach подпиской внутри подписки, я пытаюсь получить список объектов, а затем восстановить их изображения благодаря их идентификатору. В настоящее время я сделал это:

this.appTypeService.get().pipe(
  map((apps: AppTypeEntity[]) => {
    return apps.map((app) => new AppTypeEntity(app));
  })
).subscribe((apps: AppTypeEntity[]) => {
  apps.forEach((app: AppTypeEntity) => {
    if (app.Logo != null) {
      this.appTypeService.getPhoto(app.Id).subscribe((image: string) => {
        app.Image = image;
      });
    }
  });
  this.appTypeList = apps;
});

Дело в том, что, поскольку он не выполняется по порядку, иногда изображение объекта из списка будет пустым. Я хотел бы получить все мои изображения и затем установить this.appTypeList.

Вот мой getPhoto на всякий случай:

  public fileReader(blob: Blob): Observable<string> {
    return Observable.create((obs: Observer<string | ArrayBuffer>) => {
      const reader = new FileReader();

      reader.onerror = err => obs.error(err);
      reader.onabort = err => obs.error(err);
      reader.onload = () => obs.next(reader.result);
      reader.onloadend = () => obs.complete();

      return reader.readAsDataURL(blob);
    });
  }

  public getPhoto(id: string): Observable<string> {
    return this.httpClient.get(`${this.environment.get('webServiceUrl')}/photos/${id}/${this.endpoint.slice(0, -1)}/min`, { responseType: "blob" as "json" }).pipe(
      mergeMap((blob: Blob) => this.fileReader(blob))
    );
  }

Я не могу понять, как это сделать? Я посмотрел на forkJoin, но не могу понять, как правильно использовать его в моем случае.

1 Ответ

1 голос
/ 13 мая 2019

Поскольку вы уже поняли использование forkJoin , вы как бы в правильном направлении.

RxJS forkJoin() будет завершать цикл Array.forEach() перед возвратом всехнаблюдаемые.Если вы знакомы с использованием Promises в JavaScript, на самом деле это похоже на Promise.all.

const observablesList = [];

apps.forEach(app => {
  observablesList.push(this.appTypeService.getPhoto(app.Id));
})

forkJoin(observablesList).subscribe(response => {
  console.log(response);
  // handle the rest
});
...