You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularFire Storage:如何等待两张图片上传完成后更新Firestore文档

等待双图上传完成后更新Firestore文档

你可以借助RxJS的forkJoin操作符,同时监听大图和缩略图的上传任务,确保两者都完成后再获取下载URL并更新Firestore文档。修改后的代码如下:

startUpload(results) {
  // 生成图片ID
  const imageId = this.afs.createId();

  // 缩略图上传配置
  const thumbPath = `${path}/${imageId}_small.jpg`;
  const thumbTaskRef = this.storage.ref(thumbPath);
  const thumbTask = this.storage.upload(thumbPath, results.thumb).snapshotChanges();

  // 大图上传配置
  const largePath = `${path}/${imageId}_large.jpg`;
  const largeTaskRef = this.storage.ref(largePath);
  const largeTask = this.storage.upload(largePath, results.original).snapshotChanges();

  // 同时等待两个上传任务完成
  forkJoin([largeTask, thumbTask])
    .pipe(
      switchMap(async () => {
        // 两个任务都完成后,获取各自的下载URL
        const largeImageDownloadURL = await lastValueFrom(largeTaskRef.getDownloadURL());
        const thumbnailImageDownloadURL = await lastValueFrom(thumbTaskRef.getDownloadURL());
        
        return {
          large_url: largeImageDownloadURL,
          small_url: thumbnailImageDownloadURL
        };
      }),
      catchError(error => {
        // 处理上传或URL获取过程中的错误
        console.error('上传失败:', error);
        throw error;
      })
    )
    .subscribe(async (images) => {
      const newDocId = this.afs.createId();
      // 更新Firestore文档
      await this.afs
        .doc(`${path}/${someID}/images/${newDocId}`)
        .set(images, { merge: true });
      
      // 执行后续逻辑
      // ...
    });
}

关键说明:

  • forkJoin([largeTask, thumbTask]):会等待传入的两个Observable(两个上传任务的快照流)都完成后,才触发后续操作,从根源上保证双图上传完成再执行后续逻辑。
  • switchMap:将上传完成的事件流转换为获取下载URL的异步操作,确保拿到有效URL后再传递给下一步。
  • catchError:统一处理上传或URL获取过程中的错误,避免程序异常崩溃。

内容的提问来源于stack exchange,提问作者user8836786

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:45:49