编辑:忽略此问题(如何使http调用之前返回可观察到的寒冷)

时间:2018-10-08 18:55:46

标签: 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));
}

我正在尝试一种方法,return of(false);仅在saveNewUser(...)的使用者订阅时返回。换句话说,总是返回可观察到的寒冷。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则您不希望在用户订阅之前对方法的第一部分进行评估。因此,如果最初用户对象的密码为空,然后在该对象上设置了密码,然后预订了可观察对象,则您希望结果为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)
  );
}

这是一种非常尴尬的处理方式。一方面,如果传递的对象最初是未定义的,或者外部的引用已更改,则根本无法使用。更好的做法是在对用户的任何更改上创建Observable并传递其余逻辑,或者只是等待调用saveNewUser()直到设置完数据。