我最近将许多重复的代码移到了一项通用服务中,该服务可以有效地检索用户的权限。这个概念是当实例化服务时,它将打入我们的身份服务器并检索用户权限,并将它们存储一段时间。然后,组件随后调用以检查许可权将使用缓存的数据,因此我们没有大量调用我们的身份服务器来延迟用户的体验。
我正在服务的onInit方法中加载权限,并设置了一个标志来设置是否完成。
这样,我可以尝试做这样的事情:
private isDataLoaded: boolean = false;
public userHasPermission(permissionName: string): boolean{
while(!this.isDataLoaded)
{
// Do something to wait/sleep synchronously for a second, then recheck
}
return userPermissions[permissionName] == true;
}
但是,我无法弄清楚如何使线程同步睡眠。我看到的每个解决方案都是异步的,并且在线程完成时会使用一个承诺....不适用于此概念。我怎么能睡觉
答案 0 :(得分:1)
我希望从C#中获得等效的.Result。我希望能够等待此调用中的结果,而不必设置从promise转换到在调用此方法的每个地方产生的结果
在现代JavaScript(或TypeScript)中,您可以通过使用async
/ await
而不是旧的笨拙的回调方法来使用Promise。
private isDataLoaded: boolean = false;
public async userHasPermission(permissionName: string): Promise<boolean> {
// −−−−^^^^^−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^−−−−−−−^
while(!this.isDataLoaded)
{
await /* the thing that does the load and returns a promise */;
// −−−−^^^^^
}
return userPermissions[permissionName] == true;
}
使用它的代码也将在async
函数中并执行:
if (await userHasPermission("read")) {
// Read something...
}
异步性必须贯穿整个链。通常,在入口点级别(例如,事件处理程序)。拒绝会自动传播(例如同步代码中的错误),因此您无需执行任何操作,除了在顶级入口点(事件处理程序或类似程序)无法使用async
函数(因为什么也没有)将使用它返回的承诺),您使用.catch(error => { /*...handle/report error...*/ });