Firebase 存储 API 触发两次

Firebase storage API triggers twice

我正在尝试使用 Google Firebase 存储 API 来存储我的文件,但是管道被执行了两次。有什么想法让它只触发一次吗?

// def
task: AngularFireUploadTask;
storage: AngularFireStorage;

// code
this.task = this.storage.upload(path, file, { customMetadata });
    return this.task.snapshotChanges().pipe(
        map(doc => {
            console.log('me'); // THIS IS PRINTED TWICE
            return doc;
        })
    );

您可以使用运算符 take():

Emits only the first count values emitted by the source Observable.

Returns MonoTypeOperatorFunction<T>: An Observable that emits only the first count values emitted by the source Observable, or all of the values from the source if the source emits fewer than count values.

示例:

return this.task.snapshotChanges().pipe(
  take(1),
  map(doc => {
    console.log('me');
    return doc;
  })
)

https://www.learnrxjs.io/operators/filtering/take.html

根据 documentation,您可以预期管道将在上传过程中接收多个快照。随着时间的推移,这些快照中的每一个都包含一些关于上传状态的信息。

如果您只想知道上传何时完成,请从文档中的示例中获取代码,上传完成后获取下载URL:

task.snapshotChanges().pipe(
    finalize(() => this.downloadURL = fileRef.getDownloadURL() )
)