如何等待所有订阅运行完毕后返回函数?

时间:2019-01-19 13:12:37

标签: angular rxjs observable firebase-storage

我想在页面上显示一组图像在Firebase存储中。我的服务中有一个函数,我想一次下载所有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 :(得分:3)

使用forkJoin operator等待Observable数组,例如:

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>