javascript - 将多个文件上传到 Firebase 存储,当所有上传完成后,订阅 forkJoin
问题描述
我正在处理需要上传所有文件的上传表单,当所有上传完成后,我想订阅它们并触发下一步操作。
我当前不起作用的实现:
private uploadImages(): Observable<Subscription> {
const uploadImages$: Subscription [] = [];
this.testResponse.answers.forEach(answer => {
const filePath = `${answer.selectedImage.name.split('.').slice(0, -1).join('.')}_${new Date().getTime()}`;
uploadImages$.push(this.testService.uploadPhoto(filePath, answer.selectedImage).subscribe((url: string) => {
answer.imageUrl = url;
delete answer.selectedImage;
delete answer.id;
}));
});
return forkJoin(uploadImages$);}
public uploadPhoto(filePath: string, selectedImage?: UploadMetadata): Observable<string | UploadTaskSnapshot> {
return this.storage.upload(filePath, selectedImage).snapshotChanges().pipe(finalize(async () => this.getDownloadUrl(filePath))); }
public getDownloadUrl(filePath: string): Observable<string> {
return this.storage.ref(filePath).getDownloadURL(); }
1.如何在管道中提供downloadUrl之前“我等待”(finalize(async()...)?
2.你有更好的使用Angular将文件上传到Firebase的实现吗?
解决方案
希望这是您想要实现的目标:
forkJoin(uploadImages$).pipe(
map((photos) => {
return photos.map(p => p.url);
}),
switchMap((photoUrls) => {
return forkJoin(photoUrls.map(photoUrl => this.getDownloadUrl(photoUrl)));
})
)
.subscribe((downloadUrls) => {
console.log(downloadUrls);
});
推荐阅读
- android - 错误:使用 avdmanager 时找不到匹配的设备 --device Pixel 3a
- c++ - 在文件中查找单词 c++
- symfony - CKEditor 不能在 Symfony 4.4 上使用 EasyAdmin 3
- nlp - 如何使用 NLP 从成分中提取主要食物词?
- javascript - 当您分发项目时,NPM 是否会自动从您的 package.json 下载所有依赖项?
- list - 如何在多个索引处用不同的字符替换列表中的项目?
- r - 将不均匀的 json 解析为 tibble
- pytorch - Pytorch 多人聚会
- java - Maven 发布插件 - 通过服务帐户更新 pom.xml
- amazon-web-services - 托管在 AWS 上的私有 NuGet 包服务器仅对一个 NuGet 包返回 403 Forbidden 错误