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

Javascript 为什么RxJS finalize()箭头函数代码似乎没有在Firebase存储上传文件的代码中执行?,javascript,angular,firebase,rxjs,firebase-storage,Javascript,Angular,Firebase,Rxjs,Firebase Storage,我正在处理Angular应用程序,我正在创建一个服务方法,该方法必须将多个文件存储到Firebase存储中,我有以下问题\疑问 这是我的服务方法代码: async uploadFileIntoFirebaseStore(filesList: any[]) { const that = this; console.log("FILES TO BE SAVED: ", filesList); filesList.forEach(function (item, i

我正在处理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个任务对象,或者我可以使用单个任务对象来存储n个文件吗

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

that.task = that.storage.upload(path, item);
文件正确保存在Firebase存储上

然后我使用snapshotChanges()获取快照$可观察对象,并将其放入arrow函数和finalize()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()arrow函数中定义与此相关的内容:

console.log("FILE NAME: ", item.name + " URL: ", that.downloadURL); 
如果我使用调试器在finalize()arrow函数的第一行的第一行中放置一个breack点,那么这个:

that.downloadURL = await ref.getDownloadURL().toPromise();
这似乎永远不会被执行


为什么??怎么了?我错过了什么?如何解决此问题?

根据我对firestore的了解,我的猜测是,
finalize()
未执行,因为
快照更改
未完成。您可以重写代码以等待排放(
takeUntil
),也可以让
wait ref.getDownloadURL().toPromise()
成为您可以让文件上传
完成的条件。

完成
只有在可观察到的完成时才达到finalize
;未来可能会有更多的变化,所以想必“可观察的”永远不会发生。@jornsharpe ehhh我知道,但为什么?理论上,它必须在完成时执行,并且文件保存在Firebase存储上,但它似乎不起作用“理论上”是什么意思?根据什么?例如,文档是否说它完成了?