等待http.get()

时间:2018-05-23 20:28:06

标签: javascript angular ionic-framework ionic2 promise

我试图在使用角度和离子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返回的对象

2 个答案:

答案 0 :(得分:1)

在您调用服务的代码中,您需要订阅您的o​​bservable,并在订阅内部调用后执行您想要执行的任何操作。

你也不要在这里设置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*/);
}