我试图在使用角度和离子2时创建登录功能。此功能将验证用户是否通过php服务器在数据库中被篡改并返回用户id.But http.get()工作以异步形式,因此我无法比较用户是否存在于数据库上,因为函数的返回是未定义的。我尝试了两种方法,使用了observable和promises:
使用可观察的函数来调用服务:
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);
}
这样,第一次单击触发login()函数的按钮时,我得到未定义的值作为响应。第二次单击时,它返回上一个请求的值。
使用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我在第一次执行login函数时得到id返回,但是我找不到任何方法来访问__zone_symbol__value,这是根据console.log()
存储对象的地方
console response
我想知道是否有办法等待http.get()响应继续执行程序(如果使用observable)或者如何访问从promise返回的对象
答案 0 :(得分:1)
在您调用服务的代码中,您需要订阅您的observable,并在订阅内部调用后执行您想要执行的任何操作。
你也不要在这里设置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);
});
}
这样,第一次单击触发login()函数的按钮时,我得到未定义的值作为响应。第二次单击时,它返回上一个请求的值。
这是因为您正在执行console.log
而不等待订阅完成。第二次单击时,它返回上一个请求的值,因为出于同样的原因,它不等待订阅完成,因为console.log
不在订阅中,而是在您单击它时时间,第一个请求完成了。因此,this.loginusuario
是在第一个console.log
之后设置的。{/ p>
答案 1 :(得分:0)
$ http.get函数返回Promise,因为.get()方法发送async 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*/);
}