可观察函数忽略代码 "return defer"

Observable function ignoring code "return defer"

最近我正在使用 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”那是什么?

拥抱可观察的事物。您似乎在 observables 和 promises 之间来回切换,但这似乎完全没有必要。在调用 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().