Javascript 此方法如何返回可由调用方方法订阅的可观察对象?

Javascript 此方法如何返回可由调用方方法订阅的可观察对象?,javascript,angular,firebase,rxjs,firebase-storage,Javascript,Angular,Firebase,Rxjs,Firebase Storage,我不太喜欢角度和RxJS,我疯狂地尝试订阅一个可观测的 这是我的代码: createUser(用户,文件){ console.log(用户); if(user.password!=user.password\u确认){ let passwordError:any=新对象(); passwordError[“message”]=“插入的密码与插入的密码确认不同”; this.eventAuthError.next(密码错误); } 否则{ this.afAuth.auth.createUserWi

我不太喜欢角度和RxJS,我疯狂地尝试订阅一个可观测的

这是我的代码:

createUser(用户,文件){
console.log(用户);
if(user.password!=user.password\u确认){
let passwordError:any=新对象();
passwordError[“message”]=“插入的密码与插入的密码确认不同”;
this.eventAuthError.next(密码错误);
}
否则{
this.afAuth.auth.createUserWithEmailAndPassword(user.email,user.password)
。然后(userCredential=>{
console.log(“然后登录!!!”)
this.newUser=user;
日志(userCredential);
userCredential.user.updateProfile({
displayName:user.firstName+“”+user.lastName
});
log(“配置文件更新!!!”;
此.uploadFileIntoFirebaseStore(文件);
})
}
}
将文件上载到FirebaseStore(fileToBeUploaded){
var n=Date.now();
const filePath=`user_avatar/${n}`;
const fileRef=this.storage.ref(文件路径);
返回此.storage.upload(`user\u avatar/${n}`,fileToBeUploaded)
.snapshotChanges().subscribe(参考状态=>{
log(“文件引用:”,
fileRef.getDownloadURL().subscribe(urlStr=>console.log(“URL-STR:”,urlStr));
返回fileRef.getDownloadURL();
})
}
如您所见,createUSer()方法是我在Firebase上创建新用户的入口点(基本上我必须通过电子邮件和密码创建用户,将图像文件(来自我的自定义用户注册表单页面)保存到Firebase存储中,然后在FireStore中创建新对象(但在本规范中,目前尚未实现这一点)

正如您在我的createUser()方法末尾所看到的,我正在通过以下方式执行我的uploadFileIntoFirebaseStore()方法:

this.uploadFileIntoFirebaseStore(file);
这可以很好地将文件正确地插入Firebase存储

这里发生了一件我无法理解的事情

您如何了解此方法我只是订阅应用于存储上载的snapshotChanges()结果,当我的文件上载完成时,该结果将“触发”。在订阅中,我返回fileRef.getDownloadURL()这是一个Obaservable,我可以在上传完成时使用它来检索上传文件的URL

好的,现在我必须将该值(上传文件的URL)检索到以前的createUser()方法(该方法称为uploadFileIntoFirebaseStore()方法)中,因此我尝试更改此值:

this.uploadFileIntoFirebaseStore(file);
为此:

this.uploadFileIntoFirebaseStore(file).subscribe( bla => console.log("DO SOMETHING"));
这里我有一个问题:我不能订阅这个方法。我想是因为我将可观测值返回到一个内部箭头函数中,但是我的方法什么也不返回

如何修复这种情况,使uploadFileIntoFirebaseStore()返回一个可以订阅到createUser()方法中的可观察对象


还是我没有抓住要点,我的推理是错误的?

.subscribe
是一种可观察的方法

this.storage.upload(`user\u avatar/${n}`,fileToBeUploaded).snapshotChanges()
上面返回的
是可观察的
,因此您可以
订阅

但是:

this.storage.upload(`user\u avatar/${n}`,fileToBeUploaded).snapshotChanges().subscribe()
上面返回的是
订阅
,而不是
可观察的
,因此您无法订阅

订阅是一个表示可支配资源的对象,通常是可观察资源的执行

解决方案

您可以使用
.pipe
switchMap
操作符操纵
快照更改的
可观察对象的结果

返回此.storage.upload(`user\u avatar/${n}`,fileToBeUploaded)
.snapshotChanges()
.烟斗(
开关映射(refStatus=>fileRef.getDownloadURL())
);