【发布时间】:2019-06-28 08:26:49
【问题描述】:
我有这个映射:
User *----------------------------1 Role
从用户列表中,我去咨询这个列表中的一位用户。
要获取有关该选定用户的一些信息,我需要使用 localSorage 从 inside subscribe 获取一个对象到 outside subscribe。
下面是方法:
this.userService.getAllRolesOfActualUser(user.id).subscribe(listRoles =>
{
let roles:Array<Role> = [];
if (listRoles)
{
listRoles.forEach((role) =>
{
roles.push(new Role(role.id, role.name, role.selected));
});
}
sessionStorage.removeItem("roles");
sessionStorage.setItem("roles", JSON.stringify(roles));
console.log("1. Inside Subscribe- " + user.id + "--------------: " +
sessionStorage.getItem("roles"));
});
console.log("2. Outside Subscribe- " + user.id + "--------------: " + sessionStorage.getItem("roles"));
在 user.service.ts 上,我有:
getAllRolesOfActualUser(id: number): Observable<any>
{
return this.http.get(`${this.baseUrl}/users/roles/${id}`);
}
我的问题是,通常我得到的是之前咨询用户的值,而不是 screenshot 描述的实际用户 a:
你能帮我解决这个问题吗?!。 非常感谢。
【问题讨论】:
-
简单来说,
subscribe里面的代码是异步执行的。这意味着当执行到第二个console.log语句时,subscribe中的代码还没有被执行。原因是当你的 http 调用完成并且程序不知道它何时会发生时,它就会被执行,这就是它异步执行的原因。将您的第二个console.log放入订阅块中,您将获得正确的结果。但我认为您正在尝试在其他地方同步使用roles,这不会解决您的实际问题。那你到底想做什么? -
感谢@ysf 先生的回复。但我需要订阅之外的那个对象,这就是真正想要做的。
-
我需要
roles来填写清单,这将在订阅之外完成。 -
请分享填写清单的代码。