繁体   English   中英

Angular2等待$ http响应

[英]Angular2 wait on $http response

我几乎在所有REST请求中都需要用户ID。

当我登录用户时,我将令牌传递给本地存储,并将ID传递给user.service.ts(通过函数setUserId(userId);)但是当我仅通过令牌验证用户时(用户已登录但页面已刷新)我尝试从User对象获取userId(通过令牌从REST请求获取用户对象)。

这段代码看起来像:

getUser() {
    var authToken = localStorage.getItem('authorization')

    if(!this.userPromise){
      let headers = new Headers();
      headers.append('Content-type', 'application/json');
      headers.append('Authorization', authToken);

      this.userPromise = this.http.get(
        'http://localhost:8080/api/user',
        { headers }
      ).toPromise()
        .then((res) => res.json());
    }

    return this.userPromise;
  };




getUserId(){
    var $self = this;

    if($self.userId){
      return $self.userId;
    } else {
      $self.getUser().then(function(result){
        $self.setUserId(result.id);
        console.log(result.id);
        return result.id;
      });
    }
  }

当任何请求请求用户ID时,我使用getUserId()并检查是否定义了用户ID。 如果定义了我对此数据的响应,但如果没有 - 我想从getUser()函数获取此数据。

我无法解决一个问题 - 这个请求是异步的,例如“task”服务将userId值设置为undefined - 不等待这个新值。

我该如何处理这个问题?

- -编辑

雇用是一个请求 - 它不等待响应;

 getUserTasks() {
    // return this.userService.getUserId();
    var userId = this.userService.getUserId();

    return this.http.get(
      'http://localhost:8080/api/private/'+userId+'/tasks'
      // 'http://localhost:8080/api/private/1/tasks'
    )
    .toPromise()
      .then((res) => res.json());
  }

我找到了解决方案 - 只有一个人认为这是在getUserTasks()上使用async / await函数的正确方法:

 async getUserTasks() {
    let userId = await this.userService.getUserId();

    return this.http.get(
      'http://localhost:8080/api/private/'+userId+'/tasks'
    )
    .toPromise()
    .then((res) => res.json());
  }

---编辑---

最后 - 如果有人发现同样的问题,我将更改升级到身份验证过程。 通过这种方式,我可以通过服务UserService.getUserId()从我的应用程序的任何部分访问userId;

当用户登录时,我有时间将所有数据放入变量,但是当我只进行身份验证时,我将isLoggedIn()函数修改为async / await。 如果票证存在,我发送验证请求以获取用户对象。

如果我获得用户对象,则返回true并将userId放入userId服务。 当我收到错误(没有凭据)时,我在getUser()函数中进行了注销操作。

我认为这是最好的解决方案 - 它提供了所有必要的数据,并提供额外的验证过程。

async isLoggedIn() {
    var $self = this;

    if(localStorage.getItem("authorization")){
      var user = await $self.getUser();
      this.setUserId(user.id);

      return true;
    } else {
      return false;
    }
  }

暂无
暂无

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

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