我在使用Angular 7调用网络服务时遇到问题。这种调用是通过这种方式在我的服务上进行的:
getLogin(usr: String, pwd: String) {
return this.http.post("the url of webservice", { username: usr, password: pwd
});
}
以及我的组件上:
credenzialiConfronto() {
this.cred.getLogin(this.loginForm.get("username").value, this.loginForm.get("psw").value).subscribe((res => {
this.User = res;
}));
console.log(this.User);
为什么它第一次返回undefined
而第二次不返回?
编辑:
在我的组件上,我现在尝试这样做,但不起作用:
以及我的服务:
答案 0 :(得分:0)
我相信您造成了比赛状况。首次登录用户时,服务尚未返回它。相反,您可以像这样记录它:
credenzialiConfronto() {
this.cred.getLogin(this.loginForm.get("username").value, this.loginForm.get("psw").value)
.pipe(
tap(user => console.log(user))
)
.subscribe((res => {
this.User = res;
}));
进行此更改后,您只会在getLogin
调用返回时记录用户。
答案 1 :(得分:0)
这是因为javascript是asynchronous
,所以它不会等待api调用完成。
在您的代码中,您将User
记录在订阅范围之外;如果您在订阅中进行记录,则首次调用时将获得user
数据。
您的代码没有错。
要使javascript同步,您可以实现async
await
async callerFunction() {
await this.credenzialiConfronto();
console.log(this.User);
}
credenzialiConfronto() {
return new promise ((resolve, reject) => {
this.cred.getLogin(this.loginForm.get("username").value,
this.loginForm.get("psw").value).subscribe((res => {
this.User = res;
resolve();
}));
})
答案 2 :(得分:0)
根据this
这应该是您的服务
/** POST: data to the database */
login(email, password) : Observable<any>{
return this._http.post<any>(this.APIURL+`login`, { email:email, password:password})
.pipe(map(user => {
return user;
}));
}
这应该是您的组成部分
this._loginService.login(this.model.email, this.model.password)
.subscribe(
data => {
this.toast.success(data[constants.MESSAGE]);
},
error => {
this.toast.warning(constants.LOGIN_ERROR);
});