繁体   English   中英

等待http.get()的响应

[英]Wait response for http.get()

我正在尝试使用angular 2和ionic 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); 
  }

这样,当我第一次单击触发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,我会在首次执行登录功能时获得id返回,但是我找不到任何方法来访问__zone_symbol__value,该值是根据console.log() 控制台响应存储对象的位置

我想知道是否有一种方法可以等待http.get()响应继续执行程序(在使用observable的情况下),或者如何访问promise所返回的对象

在调用服务的代码中,您需要预订可观察对象,并在预订内部的调用后执行任何您想发生的事情。

您也不要在此处设置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不在订阅中,但是在第二次单击时,第一个请求确实完成了。 因此,在第一个console.log之后设置了this.loginusuario

在函数中使用async并在调用promise中await

async login() 
  {
    await this.usuario = this.loginservice.get_usuario(this.loginusuario);
    console.log(this.usuario);
  }

$ 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*/);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM