我最近把很多重复的代码移到了一个普通的服务中,这个服务可以有效地检索用户的权限。 这个概念是,当服务被实例化时,它会调用我们的身份服务器并检索用户的权限,并将其存储一段时间。 然后后续的组件调用检查权限将使用缓存的数据,所以我们不会有大量的调用身份服务器而耽误用户的体验。
我是在服务的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;
}
但是,我不知道如何让线程同步睡眠。 我看的每一个解决方案都是异步的,并且在线程完成时使用一个承诺......这对于这个概念来说是行不通的。 我如何才能让线程睡觉呢?
我希望能从C#中得到相当于.Result的东西。我希望能够在这个调用中等待结果,而不必在每个调用这个方法的地方设置从承诺到结果的转换。
在现代JavaScript(或TypeScript)中,你的方法是使用承诺,但通过 async
await
而不是以往笨拙的回调方式。
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...*/ });