等待 http.get() 的响应



我正在尝试使用角度和离子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*/);
}

相关内容

  • 没有找到相关文章

最新更新