Angular 5 HttpClient在具有值之前返回

Angular 5 HttpClient在具有值之前返回,angular,angular2-observables,angular5,Angular,Angular2 Observables,Angular5,我开始研究Angular,我有一个很简单的问题 我正在使用我通过ngx火箭工具创建的starter项目,并尝试使用我的webapi实现身份验证。我说的是这项服务() 作为Http模块,我正在使用新模块(import{HttpClient}来自'@angular/common/Http';)。我将上述服务的登录方法更改为: login(context: LoginContext): Observable<Credentials> { return this._http.

我开始研究Angular,我有一个很简单的问题

我正在使用我通过ngx火箭工具创建的starter项目,并尝试使用我的webapi实现身份验证。我说的是这项服务()

作为Http模块,我正在使用新模块(
import{HttpClient}来自'@angular/common/Http';
)。我将上述服务的
登录方法更改为:

  login(context: LoginContext): Observable<Credentials> {

    return  this._http.post<Credentials>("/api/account/login", 
      {Email : context.username,Password:context.password});        
  }
login(上下文:LoginContext):可观察{
返回此信息。_http.post(“/api/account/login”,
{电子邮件:context.username,密码:context.Password});
}
http请求发生并成功返回。我的问题:正如您所看到的,我还应该使用
this.setCredentials(数据、上下文、记住)设置凭据。让我困惑的是,如何返回可观察对象并用相同的方法设置凭证?我尝试在变量中保持返回的可观察性,订阅它,设置数据,然后返回,但它在设置数据之前返回(我知道它是异步的)

这就是让我困惑的地方,这对Angular来说是非常基本的,但对我来说仍然很困惑。如何更改此方法以提供正确的返回并设置凭据


感谢您的帮助

尝试使用
管道

login(context: LoginContext): Observable<Credentials> {
    return this._http.post<Credentials>("/api/account/login", {Email : context.username,Password:context.password})
                .pipe(
                    tap(data => {
                        this.setCredentials(data, context.remember);
                    })
                );
}
login(上下文:LoginContext):可观察{
返回此信息。http.post(“/api/account/login”,{Email:context.username,Password:context.Password})
.烟斗(
点击(数据=>{
this.setCredentials(数据、上下文、记住);
})
);
}
您可以使用lettable(以前称为
do
)操作符,但仍然返回可观察值

import { tap } from 'rxjs/operators/tap';

login(context: LoginContext): Observable<Credentials> {
    return this._http.post<Credentials>("/api/account/login", {Email : context.username,Password:context.password})
        .pipe(do((response) => {
          // this.setCredentials(data, context.remember);
        })
    );
}

从'rxjs/operators/tap'导入{tap};
登录(上下文:LoginContext):可观察{
返回此信息。http.post(“/api/account/login”,{Email:context.username,Password:context.Password})
.管道(do)(响应)=>{
//this.setCredentials(数据、上下文、记住);
})
);
}
该操作已被注释掉,因为我不确定您得到的是什么或希望通过的是什么


如果您想根据
setCredentials
的操作返回不同的内容,请改用
map
并从该方法返回内容。

谢谢您的回答!TS正在给我:找不到名称“tap”。我应该导入什么才能拥有它?
import{tap}来自'rxjs/operators'