Angular 编辑:忽略这个问题(在进行http调用之前如何返回cold OVERVABLE)
我有一个像这样的角度服务:Angular 编辑:忽略这个问题(在进行http调用之前如何返回cold OVERVABLE),angular,angular-httpclient,rxjs6,Angular,Angular Httpclient,Rxjs6,我有一个像这样的角度服务: saveNewUser(user: User): Observable<boolean> { if (!user || !user.password) { return of(false); } return this.http.put(this.saveUrl, user).pipe(map((res: Response) => res.ok)); } saveNewUser(用户:用户):可观察{ 如果(!user | |
saveNewUser(user: User): Observable<boolean> {
if (!user || !user.password) {
return of(false);
}
return this.http.put(this.saveUrl, user).pipe(map((res: Response) => res.ok));
}
saveNewUser(用户:用户):可观察{
如果(!user | |!user.password){
归还(假);
}
返回this.http.put(this.saveUrl,user.pipe)(map((res:Response)=>res.ok));
}
我正在尝试一种方法
返回(false)
仅当saveNewUser(…)
的使用者订阅它时返回。换句话说,始终返回cold observable。如果我正确理解了您的问题,您不希望在用户订阅之前对方法的第一部分进行评估。因此,如果用户对象最初有一个空密码,然后在该对象上设置密码,然后订阅可观察对象,那么您希望结果是来自http.put()的结果
在下面的示例中,用户被包装到一个可观察对象中,在订阅该可观察对象之前,管道的其余执行不会运行
saveNewUser(user: User): Observable<boolean> {
return of(user).pipe(
switchMap(u => (!u || !u.password) ? of({ ok: false }) : this.http.put(this.saveUrl, u)),
map(res => res.ok)
);
}
saveNewUser(用户:用户):可观察{
返回(用户)。管道(
({ok:false})的开关映射(u=>(!u | | |!u.password)∶this.http.put(this.saveUrl,u)),
映射(res=>res.ok)
);
}
这是一种相当尴尬的做事方式。首先,如果传递的对象最初没有定义,或者外部的引用发生了更改,那么这种方法就不起作用。更好的方法是在对用户的任何更改上创建Observable并管道化其余的逻辑,或者只是等待调用
saveNewUser()
,直到数据设置完毕。您的问题是什么?如果消费者调用let save$=saveNewUser({password:null})
以后再订阅save$。订阅(…)
然后,由于返回的可观察响应不是冷的,因此响应丢失。的返回冷的可观察响应,因此我不知道您对响应丢失的意思。如果您认为情况并非如此,请添加一个关于您的问题的最小完整示例。我使用调试器运行,并且
的yes确实返回cold。不过,感谢@Jota.Toledo占用您的时间。老实说,我并不打算在调用该方法并稍后订阅该方法后关心对象的属性更改。我想这是一个很好的用例,符合您给定的假设。谢谢