【发布时间】:2019-09-26 03:31:39
【问题描述】:
我有一个与 Firestore 后端对话的 Angular 7 应用程序。
由于异步处理,我仍在尝试围绕 Promises 与 Observables 进行比较。
考虑以下场景。在加载页面时,我需要先检查一些用户权限,然后再决定我们可以向他们展示什么。
由于权限是动态的并且本质上在页面级别,我们需要获取当前页面的 Firestore 条目,获取登录的 Firestore 用户,我单独存储的扩展用户信息,我正在寻找的权限名称,然后最后我可以检查用户的权限是否存在于页面用户权限中。
是的,我可能应该对数据进行非规范化。
但是您可以从这里看到,在显示数据之前,我必须先运行几个级别的查询,而且我真的厌倦了所有嵌套的 Observable 订阅。
checkGroupPermission(groupId: string, permissionName: string): any {
this.userService.getCurrentUser().then(user => {
this.userService.getUserForFirebaseUid(user.uid).subscribe(users => {
if (users.length === 0) { return false; }
this.groupUsersService.getAllForUser(users[0].id).subscribe(groupUsers => {
const groupUser = groupUsers.find(cu => cu.groupId === groupId);
this.roleService.getRole(groupUser.roleId).subscribe(role => {
this.rolePermissionService.getRolePermissionsForRoleId(role.id).subscribe(rolePermissions => {
this.permissionService.getPermissionByName(permissionName).subscribe(permissions => {
if (permissions.length === 0) { return false; }
const rolePermission = rolePermissions.find(rp => rp.permissionId === permissions[0].id);
if (rolePermission) {
return true;
} else {
return false;
}
});
});
});
});
});
});
}
我还有大约五种不同的权限要检查。我想整理一下,并查看了 Promises vs Observables。
checkSomething(): Promise<boolean> {
return this.myService.getData().then(data => {
return true;
}, reason => {
return false;
});
}
subCheckOfSomething(): Observable<boolean> {
return this.myService.getFirebaseSubscribe().pipe(map(dataArray => {
if (dataArray.length > 0) {
return true;
} else {
return false;
}
}));
}
这两个函数分开很好,但如果我尝试从另一个调用一个:
checkSomething(): Promise<boolean> {
return this.myService.getData().then(data => {
this.subCheckOfSomething().subscribe(data => { return data; });
}, reason => {
return false;
});
}
不起作用,因为 Observable 不是 Promise
我知道我可以重写 subCheckOfSomething 以返回 Promise:
subCheckOfSomething(): Promise<boolean> {
return new Promise(resolve,reject) => {
const data = this.myService.getFirebaseSubscribe().pipe(map(dataArray => {
if (dataArray.length > 0) {
return true;
} else {
return false;
}
}));
data.subscribe(result => {
resolve(result);
}, err => {
reject(err); })
});
}
但这感觉不是最好的解决方案。有没有首选的处理方案的方法?
【问题讨论】:
标签: angular typescript promise observable