【问题标题】:Promise inside Observable in Angular 7+Angular 7+ 中的 Observable 中的 Promise
【发布时间】:2020-06-27 16:35:35
【问题描述】:

我有一个无法解决的问题。

ngOnInit 事件中,我观察到了 url 参数。此参数对应于 firebase-storage 中的一个文件夹。这样,在加载时,我会在该文件夹中获得一个文件夹和/或文件的列表,这些文件夹和/或文件被告知并将其存储在 listReferences 变量中,该变量的类型为 Reference[]。

代码如下:

ngOnInit() {
  this.route.params
    .subscribe(params => {
      this.getFiles(params.ref).subscribe(
        (listReferences) => {
          this.listReferences = listReferences;
        }
      );
    }
  );
}

getFiles(folder: string) {
  return this.storage.ref('/' + folder).listAll()
  .pipe(
    map((data) => {
      return data.items;
    })
  );
}

事实证明,对于listReferences 数组中的每个项目,我需要访问有希望的getDownloadUrl()getMetadata() 方法,但我无法检索数组中每个项目的值。在这种情况下我应该如何处理?如何最好地做到这一点?

基本上,我遵循参考指南中包含的信息。 https://firebase.google.com/docs/reference/js/firebase.storage.Reference

【问题讨论】:

  • 也许你可以使用回调函数来解决这个问题。
  • 具体怎么做?我试图在code snippet below 中的数组中制作一个地图......但它没有工作......
  • getMetadata 在您的代码中位于何处? listReference 是否由具有 getMetadata 方法作为其属性的实体组成?

标签: javascript angular firebase asynchronous firebase-storage


【解决方案1】:

如下使用ForkJoin怎么样:

ngOnInit() {
  this.route.params
    .pipe(
      mergeMap(x => this.getFiles(x.ref)),
      mergeMap((listReferences: { getDownloadUrl: () => Promise<string> }[]) => {
        return forkJoin(listReferences.map(x => x.getDownloadUrl()))
      })
    )
    .subscribe(x =>  this.urls = x)
}

【讨论】:

  • mergeMap((listReferences: { getDownloadUrl: () =&gt; Promise&lt;string&gt; }[]) =&gt; {这行我没看懂
  • 我需要2个mergeMap吗?一个承诺 getMetadata () 另一个承诺 getDownloadUrl () ???
  • 在流程结束时,我需要一个数组,其中每个项目都有其原始值 + 承诺值 getMetadata() + 承诺值 getDownloadUrl()
  • 我明白了,你为什么不把你的界面贴出来,这样我才能理解你希望它在最终过程中的样子?
猜你喜欢
  • 1970-01-01
  • 2017-12-22
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2017-08-03
  • 2021-07-06
相关资源
最近更新 更多