Как подождать, пока все подписки будут запущены, прежде чем возвращать функцию? - PullRequest
0 голосов
/ 19 января 2019

У меня есть набор изображений в хранилище баз данных, которые я хотел бы отобразить на странице. У меня есть функция в моем сервисе, где я хочу скачать все URL-адреса одновременно. Я не уверен, как я могу написать это так, чтобы photoSrcs выходил только после того, как все функции подписки были выполнены.

Я вставил код, который у меня ниже, но очевидно, что photoSrcs будет пустым.

loadPhotoUrls(photos : Photo[]) : any
  {
    const photoSrcs = {};

    photos.forEach(async (photo, index) => {
      const fileRef = this.storage.ref('photo.fileLocation');

      fileRef.getDownloadURL().subscribe(url => {
        photoSrcs[photo.id] = url;
      });
    });

    return photoSrcs;
  }

1 Ответ

0 голосов
/ 19 января 2019

Используйте оператор forkJoin для ожидания массива наблюдаемых, что-то вроде:

const { forkJoin, of } = rxjs; // = require("rxjs")

// simulate API call
const fetchFromApi = id => of(`result: ${id}`);

const ids = [1, 2, 3, 4, 5];
const requests = ids.map(fetchFromApi);
forkJoin(requests)
  .subscribe(e => console.log(e))
<script src="https://unpkg.com/rxjs@6.3.3/bundles/rxjs.umd.min.js"></script>
...