微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 RxJS finalize() 箭头函数代码似乎没有在这段在 Firebase 存储上上传文件的代码中执行?

如何解决为什么 RxJS finalize() 箭头函数代码似乎没有在这段在 Firebase 存储上上传文件的代码中执行?

我正在开发一个 Angular 应用程序,我正在创建一个服务方法,该方法必须将多个文件存储到 Firebase 存储中,但我遇到了以下问题\怀疑。

这是我的服务方法代码

async uploadFileIntoFirebaseStore(filesList: any[]) {
  const that = this;


  console.log("FILES TO BE SAVED: ",filesList);

  filesList.forEach(function (item,index) {
    console.log(item.name,index);
  
    // The storage path
    const path = `test/${Date.Now()}_${item.name}`;

    // Reference to storage bucket
    const ref = that.storage.ref(path);

    // The main task
    that.task = that.storage.upload(path,item);

    // Progress monitoring
    that.percentage$ = that.task.percentageChanges();

    that.snapshot$ = that.task.snapshotChanges().pipe(
      tap(console.log),// The file's download URL
      finalize( async() =>  {
        that.downloadURL = await ref.getDownloadURL().toPromise();
        console.log("FILE NAME: ",item.name + " URL: ",that.downloadURL);  
      }),);
  });
}

如您所见,它需要一个包含必须保存到 Firebase 存储中的文件列表的数组。

我正在迭代这个列表,为每个文件创建一个唯一的名称(所以当它保​​存在 Firebase 存储上时,我避免了冲突),然后我检索存储引用并创建存储上传任务。

这里有一个疑问:如果我上传 n 个文件,我是否需要创建 n 个 task 对象,或者我可以使用单个任务对象来存储 n 个文件吗?

任务通过这一行将我的文件正确保存到 Firebase 存储中:

that.task = that.storage.upload(path,item);

文件已正确保存在 Firebase 存储中。

然后我使用 snapshotChanges()获取 snapshot$ Observable 对象并进入箭头函数finalize() strong> arrrow 函数我定义了检索上传文件的 URL 以便将其打印到控制台的行为。

问题是我没有在 Chrome 控制台中获取这些信息。

这是我控制台的输出

asset.service.ts:62 FILES TO BE SAVED:  [File]
asset.service.ts:65 Schermata da 2020-11-26 21-26-23.png 0

引用这些控制台行:

console.log("FILES TO BE SAVED: ",filesList);

并将这个放入我的 foreach 循环中:

console.log(item.name,index);

但我没有与定义到 finalize() 箭头函数中的这个相关:

console.log("FILE NAME: ",that.downloadURL); 

如果我使用调试器在 finalize() 箭头函数的第一行的第一行放置一个中断点,这个:

that.downloadURL = await ref.getDownloadURL().toPromise();

似乎从未执行过。

为什么?怎么了?我错过了什么?我该如何解决这个问题?

解决方法

根据我读到的有关 firestore 的信息,我的猜测是 finalize() 未执行,因为 snapshotChanges Observable 未完成。您可以重写您的代码以等待 n 发射而不是 (takeUntil) 或者让 await ref.getDownloadURL().toPromise() 成为您可以让您的文件上传为 completed

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。