Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在第一次调用属性的get-in-typescript时初始化属性_Typescript_Angular6 - Fatal编程技术网

仅在第一次调用属性的get-in-typescript时初始化属性

仅在第一次调用属性的get-in-typescript时初始化属性,typescript,angular6,Typescript,Angular6,我最近将许多重复的代码移到了一个公共服务中,该服务可以有效地检索用户的权限。其概念是,当服务被实例化时,它将访问我们的identity server并检索用户权限,并将其存储一段时间。然后组件为检查权限而进行的后续调用将使用缓存的数据,因此我们不会有大量对身份服务器的调用延迟用户体验 我正在服务的onInit方法中加载权限,并将标志设置为是否完成 通过这种方式,我可以尝试这样做: private isDataLoaded: boolean = false; public userHasPerm

我最近将许多重复的代码移到了一个公共服务中,该服务可以有效地检索用户的权限。其概念是,当服务被实例化时,它将访问我们的identity server并检索用户权限,并将其存储一段时间。然后组件为检查权限而进行的后续调用将使用缓存的数据,因此我们不会有大量对身份服务器的调用延迟用户体验

我正在服务的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#的结果相当于。我希望能够等待此调用中的结果,而不必在调用此方法的每个地方设置从promise到result的转换

在现代JavaScript(或TypeScript)中,实现这一点的方法是使用承诺,但是通过
async
/
wait
而不是旧式笨拙的回调方式

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
函数(因为不会使用它返回的承诺)即可使用
.catch(error=>{/*…handle/report error…*/})

为什么要同步睡眠?在此期间不会发生其他任何事情……如果您想同步等待异步结果,.@T.J.Crowder我希望得到与C#的.result等效的结果。我希望能够在这个调用中等待结果,而不必在调用这个方法的每个地方设置从promise到result的转换
。result
可能会导致C中的死锁,并且如果您确实需要这样做的话,也应该避免其他原因,这比很多人都少(并不意味着您)认为应该使用
.GetAwaiter().GetResult()
,因为它修复了使用
.Result
时异常处理的问题。
if (await userHasPermission("read")) {
    // Read something...
}