首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待http.get()的响应

等待http.get()的响应
EN

Stack Overflow用户
提问于 2018-05-23 20:28:05
回答 3查看 5.9K关注 0票数 1

我试图在使用角和离子2时创建一个登录函数。这个函数将验证用户是否通过php服务器在数据库上注册,并返回用户id.But http.get()是否以异步形式工作,因此我无法比较用户是否存在于数据库上,因为函数的返回是未定义的。我尝试了两种方法,用可观察的方法和承诺:

使用可观察的函数调用服务:

代码语言:javascript
运行
复制
login() 
  {
    this.usuario = this.loginservice.get_usuario(this.loginusuario).subscribe(response =>this.usuario = response);
    console.log(this.usuario);
  }

服务代码:

代码语言:javascript
运行
复制
public get_usuario(usuario):Observable<any>
  {
      return this.http.get(this.urlusuario +"/"+ usuario.usuario +"/"+ 
   usuario.senha); 
  }

这样,当我第一次单击触发login ()函数的按钮时,我就会得到响应中未定义的值。第二次单击时,它返回前一个请求的值。

使用调用服务的承诺函数:

代码语言:javascript
运行
复制
login() 
  {
    this.usuario = this.loginservice.get_usuario(this.loginusuario);
    console.log(this.usuario);
  }

服务代码:

代码语言:javascript
运行
复制
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 ()响应继续执行程序(在使用可观察的情况下),或者如何访问从承诺返回的对象

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-23 20:37:59

函数中使用async,调用承诺中使用await

代码语言:javascript
运行
复制
async login() 
  {
    await this.usuario = this.loginservice.get_usuario(this.loginusuario);
    console.log(this.usuario);
  }
票数 1
EN

Stack Overflow用户

发布于 2018-05-23 20:36:56

在调用服务的代码中,您需要订阅可观察到的服务,并在订阅内部调用之后执行您想要的任何操作。

你也不能在这里设置this.usuario = this.loginservice.get_usuario...。您将this.usario设置为等于Observable,而不是Observable的响应。

代码语言:javascript
运行
复制
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之后设置的。

票数 1
EN

Stack Overflow用户

发布于 2018-05-23 20:36:04

$http.get函数返回承诺,因为.get()方法发送异步ajax请求。要写入对变量的响应,您需要这样做:

代码语言:javascript
运行
复制
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*/);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50496963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档