仅在首次调用其get in typescript时初始化属性

时间:2020-05-13 17:31:23

标签: typescript angular6

我最近将许多重复的代码移到了一项通用服务中,该服务可以有效地检索用户的权限。这个概念是当实例化服务时,它将打入我们的身份服务器并检索用户权限,并将它们存储一段时间。然后,组件随后调用以检查许可权将使用缓存的数据,因此我们没有大量调用我们的身份服务器来延迟用户的体验。

我正在服务的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;
}

但是,我无法弄清楚如何使线程同步睡眠。我看到的每个解决方案都是异步的,并且在线程完成时会使用一个承诺....不适用于此概念。我怎么能睡觉

1 个答案:

答案 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...*/ });