【发布时间】:2017-11-19 14:45:18
【问题描述】:
我几乎在所有 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() 并检查用户是否 标识已定义。如果已定义,我会使用此数据进行响应,但如果没有 - 我想从 getUser() 函数中获取此数据。
我无法解决一个问题 - 此请求是异步的,例如“任务”服务将 userId 值设置为未定义 - 不等待这个新值。
我该如何解决这个问题?
---编辑
招聘是一个请求 - 它不会等待响应;
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());
}
【问题讨论】:
-
你能提供一个 plnker 吗?
-
您能说明您是如何使用模板中的值的吗?所以我可以给你最快的方法来实现它。你似乎为一项小任务做了太多的工作。
-
在我的模板中我只有这个:{{data | async}} 我知道 - 我可以使用 ng-if="user.id" 在框架中加载everythink,但在这种情况下它不是很好的解决方案。
-
如果你使用箭头函数
() => {}而不是function() {},那么你就不需要使用丑陋的$selfhack,而可以直接使用this. -
感谢@GünterZöchbauer 的建议。有时我在 ES6 中忘记了这一点,因为我在旧标准中编写了很多必要的代码。
标签: angular typescript async-await angular-promise