如何解决为什么 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 举报,一经查实,本站将立刻删除。