Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 从finalize方法返回一个可观察的_Angular_Firebase_Rxjs - Fatal编程技术网

Angular 从finalize方法返回一个可观察的

Angular 从finalize方法返回一个可观察的,angular,firebase,rxjs,Angular,Firebase,Rxjs,具体情况如下: AngularFirebase文档指出,为了从上传的文件中获取下载URL,您需要执行以下操作: const task = this.storage.upload(filePath, file); // observe percentage changes // get notified when the download URL is available task.snapshotChanges().pipe( finalize(() => this.downlo

具体情况如下: AngularFirebase文档指出,为了从上传的文件中获取下载URL,您需要执行以下操作:

const task = this.storage.upload(filePath, file);

// observe percentage changes
// get notified when the download URL is available
task.snapshotChanges().pipe(
    finalize(() => this.downloadURL = fileRef.getDownloadURL() )
 )
.subscribe();
}
现在,我有了一个upload方法,我想从中返回一个可观察的字符串。我的方法签名如下所示:

upload(file :File) :Observable<string> {

......

}
上传(文件:文件):可观察{
......
}
我试着这样做:

return <Observable<string>>task.snapshotChanges().pipe(
        finalize(() => {
            const url = fileRef.getDownloadURL();
            console.log('download url is ',url);
            return url;
        })
    );
返回任务.snapshotChanges().pipe(
完成(()=>{
const url=fileRef.getDownloadURL();
log('下载url为',url);
返回url;
})
);
但这不起作用,因为在原始可观察对象中还有快照类型的其他元素更改


现在我的问题是,如何使用示例中的代码有效地返回我想要的类型,如文档中所述,
finalize

返回一个Observable,该Observable镜像源Observable,但当源在完成或出错时终止时将调用指定函数

这意味着,您不能使用传递的函数更改可观察类型

相反,您可以将
last
操作符和
map
操作符组合起来,以获取映射到所需属性的最后一个值的通知。它看起来是这样的:

return <Observable<string>>task.snapshotChanges().pipe(
        last(),
        map(() => {
            const url = fileRef.getDownloadURL();
            console.log('download url is ',url);
            return url;
        })
    );
返回任务.snapshotChanges().pipe(
最后(),
地图(()=>{
const url=fileRef.getDownloadURL();
log('下载url为',url);
返回url;
})
);

我也有同样的问题,这是我的解决方案

return <Observable<string>>task
      .snapshotChanges()
      .pipe(
        last(),
        flatMap(
          () => {
            return fileRef.getDownloadURL().pipe(
              map((url) => {
                return url;
              })
            );
          }
        )
      );
返回任务
.snapshotChanges()
.烟斗(
最后(),
平面图(
() => {
返回fileRef.getDownloadURL()管道(
地图((url)=>{
返回url;
})
);
}
)
);

只需删除
订阅
,然后返回不起作用的内容。我更新了问题对不起,我的错。添加(在
完成之后)
映射(()=>fileRef.getDownloadURL())
。不确定从何处获取
fileRef
,但
map
函数将转换触发次数过多的ObservableThat发出的值。这很管用,但很糟糕,这很好,而且几乎管用,除了
fileRef.getDownloadURL()
本身返回一个可观察的值!所以它最终是可维护的好吧,这应该没有问题;只需将
map
替换为
mergeMap
;-)好主意,但要小心,如果您的源observable尚未发出值,它会抛出错误!很酷,谢谢。但对最后一个
有点怀疑。rxjs如何知道
last
实际上是
last
?它是否基于观察者的
完整的
方法?欢迎使用。虽然这段代码片段可能是解决方案,但包含解释确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。请查看更多详细信息。