angular - Συνάρτηση Observable που αγνοεί τον κώδικα "return defer"


Πρόσφατα δουλεύω με το Angular 11, προσπαθώ να φτιάξω μια συνάρτηση που ελέγχει αν ο λογαριασμός επιτρέπεται να κάνει μια ενέργεια, όμως πρέπει να την παίρνω κάθε φορά που υπάρχει αλλαγή στο SAS Token, δηλαδή, έφτιαξα τις παρακάτω συναρτήσεις

      /**
   *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» καλεί την παραπάνω συνάρτηση για να έχει μια τιμή Boolean

η συνάρτηση "HasActionPermission" απλώς δεν μπαίνει στο "return defer", τι μπορεί να είναι;

Απάντηση #1

Αγκαλιάστε τα observables. Φαίνεται ότι πηγαίνετε πέρα δώθε μεταξύ observables και promises, αλλά αυτό φαίνεται εντελώς περιττό. Μη διστάσετε να καλέσετε toPromise() μετά την κλήση του hasActionPermissions().

Ιδού μια επανεγγραφή μόνο με 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().