在typecript中,只有在第一次调用get时才初始化一个属性。

问题描述 投票:1回答:1

我最近把很多重复的代码移到了一个普通的服务中,这个服务可以有效地检索用户的权限。 这个概念是,当服务被实例化时,它会调用我们的身份服务器并检索用户的权限,并将其存储一段时间。 然后后续的组件调用检查权限将使用缓存的数据,所以我们不会有大量的调用身份服务器而耽误用户的体验。

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

但是,我不知道如何让线程同步睡眠。 我看的每一个解决方案都是异步的,并且在线程完成时使用一个承诺......这对于这个概念来说是行不通的。 我如何才能让线程睡觉呢?

typescript angular6
1个回答
1
投票

我希望能从C#中得到相当于.Result的东西。我希望能够在这个调用中等待结果,而不必在每个调用这个方法的地方设置从承诺到结果的转换。

在现代JavaScript(或TypeScript)中,你的方法是使用承诺,但通过 asyncawait 而不是以往笨拙的回调方式。

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

© www.soinside.com 2019 - 2024. All rights reserved.