我有这个映射:
User *----------------------------1 Role
从用户列表中,我去咨询该列表中的一位用户。
要获取有关所选用户的一些信息,我需要使用localSorage
从内部订阅到外部订阅获取对象。
下面是方法:
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:
能帮我解决这个问题吗?! 非常感谢。
答案 0 :(得分:1)
我不确定您实际上想要实现什么,但是如果您想直接在示例下面的结果“ subscribe之外”,则可能必须以更同步的方式运行代码。
例如,您可以使用Promise而不是Observable来等待执行:
await this.userService.getAllRolesOfActualUser(user.id).then(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"));
为您服务:
getAllRolesOfActualUser(id: number): Promise<any>
{
return this.http.get(`${this.baseUrl}/users/roles/${id}`).toPromise();
}
答案 1 :(得分:1)
source 因此您必须使用Promise:
getData(){
var promiseData =return new Promise((resolve, reject) => {
this.userService.getAllRolesOfActualUser(user.id).subscribe('........')
.subscribe(
data => {
//your handlings
resolve(data)
},
error => {
reject(error);
},
);
});
return promiseData;
}
并在您的控制器中:
getData().then(data => {
console.log(data);
//do here what you want
})
如果知道了,只需测试一下并检查
doAsyncTask() {
let error = true;
return new Promise((resolve, reject) => {
setTimeout(() => {
if (error) {
reject('error'); // pass values
} else {
resolve('done'); // pass values
}
}, 1000);
});
}
this.doAsyncTask().then(
(val) => console.log(val),
(err) => console.error(err)
);
*********我根据您的主张进行编辑
doAsyncTask() {
let error = true;
return new Promise((resolve, reject) => {
setTimeout(() => {
if (error) {
reject('error'); // pass values
} else {
this.userService.getExpertisesListByIdUserObj(2)
// .subscribe('........')
.subscribe(listExpertises =>
{
console.log("YES");
let exps:Array<Expertise> = [];
if (listExpertises)
{
listExpertises.forEach((expert) =>
{
exps.push(new Expertise(expert.id, expert.name, expert.selected));
});
}
sessionStorage.removeItem("exps");
sessionStorage.setItem("exps", JSON.stringify(exps));
console.log("1. MODIF-IN " + 2 + "--------------: " + sessionStorage.getItem("exps"));
});
resolve('done'); // pass values
}
}, 1000);
});
}
答案 2 :(得分:0)
从user.service.ts
的对象池中(Array of Objects)
和组件中仅获取一个对象。ts您将有效负载另存为字符串对象,以便获得所需的结果。通过
let role = sessionStorage.getItem('roles');
let rolesObject = JSON.parse('role')
console.log("1. LIST- " + user.id + "--------------: " + rolesObject;
我不知道您为什么要执行array.push,但我认为您应该只将有效负载放在listRoles
中。
答案 3 :(得分:0)
您必须使用承诺:
ses : String[];
expertises : String[] = [];
async getUri(userId: number)
{
let affected = this.userService.getExpertisesListByIdUserPromise(userId);
await affected.then((uri) =>
{
this.ses = uri;
})
return this.ses;
}
在ngOnInit上,我有
this.getUri(16).then(item =>
{
item.forEach(pro=>
{
this.expertises.push(pro);
});
});
在服务文件上,您具有:
getExpertisesListByIdUserPromise(id: number): Promise<any>
{
return this.http.get(`${this.baseUrl}/users/expertises/${id}`).toPromise();
}
HTH