我正在尝试使用角度和离子2进行登录功能。这个函数将通过 php 服务器验证用户是否在数据库中被地籍并返回一个用户 id.但是 http.get(( 以异步形式工作,所以我无法比较用户是否存在于数据库,因为函数的返回是未定义的。我尝试了两种方法,使用可观察和承诺:
使用可观察的函数调用服务:
login()
{
this.usuario = this.loginservice.get_usuario(this.loginusuario).subscribe(response =>this.usuario = response);
console.log(this.usuario);
}
服务代码:
public get_usuario(usuario):Observable<any>
{
return this.http.get(this.urlusuario +"/"+ usuario.usuario +"/"+
usuario.senha);
}
这样,当我第一次单击触发登录 (( 函数的按钮时,我会得到未定义的值作为响应。第二次单击时,它返回上一个请求的值。
使用 promise 调用服务的函数:
login()
{
this.usuario = this.loginservice.get_usuario(this.loginusuario);
console.log(this.usuario);
}
服务代码:
public get_usuario(usuario):Promise<any>
{
var resultado;
return this.http.get(this.urlusuario +"/"+ usuario.usuario +"/"+ usuario.senha).toPromise().then(function(data){
return data;
});
}
使用 promise,我在第一次执行登录函数时获得 id 返回,但是我找不到任何方法来访问根据console.log()
存储对象的__zone_symbol__value 控制台响应
我想知道是否有办法等待 http.get (( 响应继续程序执行(在使用可观察的情况下(,或者我如何访问从承诺返回的对象
在函数中使用async
,在调用承诺中使用await
async login()
{
await this.usuario = this.loginservice.get_usuario(this.loginusuario);
console.log(this.usuario);
}
在调用服务的代码中,需要订阅可观察量,并在订阅内调用后执行任何想要发生的操作。
您也不会在此处设置this.usuario = this.loginservice.get_usuario...
。您将 this.usario 设置为等于Observable
,而不是Observable
的响应。
login()
{
this.loginservice.get_usuario(this.loginusuario).subscribe(response => {
this.usuario = response;
console.log(this.usuario);
});
}
这样,当我第一次单击触发登录 (( 函数的按钮时,我会得到未定义的值作为响应。第二次单击时,它返回上一个请求的值。
发生这种情况是因为你在不等待订阅完成的情况下执行console.log
。第二次单击时,它将返回上一个请求的值,因为出于同样的原因,它不会等待订阅完成,因为console.log
不在订阅中,但当您第二次单击它时,第一个请求确实已完成。因此,this.loginusuario
是在第一个console.log
之后设置的。
$http.get 函数返回 Promise,因为 .get(( 方法发送异步 ajax 请求。要写入对变量的响应,您需要执行以下操作:
login () {
var self = this;
this.http.get('/url/').then(response => {
self.usuario = response;
// It will write response from server to your variable when the
// request will be done
}).catch(error => /*Your error handler*/);
}