我试图在使用角和离子2时创建一个登录函数。这个函数将验证用户是否通过php服务器在数据库上注册,并返回用户id.But 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);
}
这样,当我第一次单击触发login ()函数的按钮时,我就会得到响应中未定义的值。第二次单击时,它返回前一个请求的值。
使用调用服务的承诺函数:
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;
});
}
使用诺言,我在登录函数的第一次执行时获得id返回,但是我找不到任何方法来访问__zone_symbol__value,这是根据console.log()
控制台响应存储对象的位置。
我想知道是否有一种方法可以等待http.get ()响应继续执行程序(在使用可观察的情况下),或者如何访问从承诺返回的对象
发布于 2018-05-23 20:37:59
函数中使用async
,调用承诺中使用await
async login()
{
await this.usuario = this.loginservice.get_usuario(this.loginusuario);
console.log(this.usuario);
}
发布于 2018-05-23 20:36:56
在调用服务的代码中,您需要订阅可观察到的服务,并在订阅内部调用之后执行您想要的任何操作。
你也不能在这里设置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
之后设置的。
发布于 2018-05-23 20:36:04
$http.get函数返回承诺,因为.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*/);
}
https://stackoverflow.com/questions/50496963
复制相似问题