Angular2 等待 $http 响应
Angular2 wait on $http response
我几乎在所有 REST 请求中都需要用户 ID。
当我登录用户时,我将令牌传递给本地存储并将 ID 传递给 user.service.ts(通过函数 setUserId(userId);)但是当我仅通过令牌对用户进行身份验证时(用户已登录但页面已刷新)我尝试从用户对象中获取用户 ID(通过令牌从 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() 函数中获取此数据。
我无法解决一个问题 - 这个请求是异步的,例如 "task" 服务将 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());
}
我找到了解决方案 - 只有一个人认为是在 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。如果票证存在,我发送身份验证请求以获取用户对象。
如果我得到用户对象,我 return 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;
}
}
我几乎在所有 REST 请求中都需要用户 ID。
当我登录用户时,我将令牌传递给本地存储并将 ID 传递给 user.service.ts(通过函数 setUserId(userId);)但是当我仅通过令牌对用户进行身份验证时(用户已登录但页面已刷新)我尝试从用户对象中获取用户 ID(通过令牌从 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() 函数中获取此数据。
我无法解决一个问题 - 这个请求是异步的,例如 "task" 服务将 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());
}
我找到了解决方案 - 只有一个人认为是在 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。如果票证存在,我发送身份验证请求以获取用户对象。
如果我得到用户对象,我 return 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;
}
}