javascript - 为什么在将文件上传到 Firebase 存储的这段代码中似乎没有执行 RxJS finalize() 箭头函数代码?
问题描述
我正在开发一个 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()来获取snapshot$ Observable 对象并进入箭头函数和finalize()箭头函数我定义了检索上传文件的 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: ", item.name + " URL: ", that.downloadURL);
如果我使用调试器将断点放入 finalize() 箭头函数的第一行的第一行,这个:
that.downloadURL = await ref.getDownloadURL().toPromise();
似乎永远不会执行。
为什么?怎么了?我错过了什么?我该如何解决这个问题?
解决方案
根据我对 firestore 的了解,我的猜测是finalize()
未执行,因为snapshotChanges
Observable 未完成。您也许可以重写您的代码以等待n
排放(takeUntil
),或者也许await ref.getDownloadURL().toPromise()
有条件可以让您的文件上传completed
推荐阅读
- bash - 仅在脚本中禁止 bash 作业控制消息(已中止,管道损坏)
- asp.net-core - _Imports.razor 在 WebAssembly 项目中不能开箱即用
- c# - 以下循环是否有 C# LINQ 替代方案?
- git - 如何将文件从现有的非基于存储库的项目正确推送到 gitlab
- python - 如何使用 fastapi 部署可扩展的 API?
- javascript - 异步 foreach 函数
- c - 使用 xinit 向其传递一些参数时启动应用程序的问题
- java - pdfbox嵌入子集字体用于注释
- oracle - 我想使用其他表中的条件向下更新日期时间直到下一个日期
- python - 比较两个excel文件并返回不常见的行