Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.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 编辑:忽略这个问题(在进行http调用之前如何返回cold OVERVABLE)_Angular_Angular Httpclient_Rxjs6 - Fatal编程技术网

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占用您的时间。老实说,我并不打算在调用该方法并稍后订阅该方法后关心对象的属性更改。我想这是一个很好的用例,符合您给定的假设。谢谢