2017-06-16 160 views
2

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

当我登录一个用户时,我将令牌传递给本地存储并将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(),我检查,如果用户 标识的定义。如果定义了我对这个数据的回应,但是如果没有 - 我想从getUser()函数获取这个数据。

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

我该如何解决这个问题?

--- EDIT

录用是请求 - 它好好尝试等待响应;

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()); 
    } 
+0

请问您可以提供一个plnker吗? –

+0

你能展示你如何使用模板中的值吗?所以我可以给你最快的方式来实现它。你似乎为一项小任务做了太多工作。 –

+0

在我的模板中,我只有这个: {{data | async}} 我知道 - 我可以加载ng-if =“user.id”的框架中的所有内容,但在这种情况下它不是很好的解决方案。 –

回答

2

我找到了解决方案 - 唯一一个认为做的是使用上getUserTasks()异步/ 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; 
    } 
    } 
+0

很高兴听到,只是让你知道,async/away使用承诺下的承诺。 [这里](https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8)是一个很好的帖子,如果你想知道更多关于它 –

+0

谢谢你你的帮助@Omri吕宋 –