【问题标题】:Observable function ignoring code "return defer"忽略代码“return defer”的可观察函数
【发布时间】:2021-08-10 01:17:58
【问题描述】:

最近我正在使用 Angular 11,我正在尝试执行一个功能来检查帐户是否被允许执行操作,但是只要 SAS 令牌发生更改,我就必须获取它,也就是说,我做到了下面的函数

      /**
   *Verify if SAS has permissions
   * @param sasUri Sas address
   * @param permissions The permissions to verify
   * @returns Boolean Value
   */
  async hasPermissions(sasUri: string, permissions: SASInformationPermission[]): Promise<boolean> {
    const permissionAccount = await this.getSASUriInformation(sasUri).toPromise();
    return permissions.every((permission) => {
      permissionAccount.signedPermissions.includes(permission);
    });
  }

  /**
   * Get validation of action permission
   * @param sasUri Sas address
   * @param action The action to check
   * @returns Boolean value
   */
  hasActionPermission(sasUri: string, action: Action): Observable<boolean> {
    return defer(async () => {
      let permission: SASInformationPermission[];
      if (action === 'upload') {
        permission = [
          SASInformationPermission.Read,
          SASInformationPermission.List,
          SASInformationPermission.Write,
        ];
      } else {
        permission = [SASInformationPermission.List, SASInformationPermission.Read];
      }

      return await this.hasPermissions(sasUri, permission);
    });
  }

“hasPermissions”函数获取并检查 SAS 是否有权访问由参数传递的操作,并且“HasActionPermission”函数调用上述函数以获得布尔值

函数“HasActionPermission”根本不进入“return defer”会是什么?

【问题讨论】:

    标签: angular typescript promise observable


    【解决方案1】:

    拥抱可观察的。您似乎在可观察对象和承诺之间来回走动,但这似乎完全没有必要。在调用hasActionPermissions() 后,请随时致电toPromise()

    这是一个仅 rxjs 的重写:

    hasPermissions(sasUri: string, permissions: SASInformationPermission[]): Observable<boolean> {
      return this.getSASUriInformation(sasUri).pipe(
        map(acct => permissions.every(x => acct.signedPermissions.includes(x)))
      );
    }
    
    hasActionPermission(sasUri: string, action: Action): Observable<boolean> {
      const permission: SASInformationPermission[] = (action === 'upload') 
        ? [SASInformationPermission.Read, SASInformationPermission.List, SASInformationPermission.Write]
        : [SASInformationPermission.List, SASInformationPermission.Read];
        
      return this.hasPermissions(sasUri, permission);
    }
    

    干净多了,在你打电话subscribe()toPromise()之前会很冷,不需要defer()

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2017-06-20
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多