angular - Observable-funktion som ignorerar koden "return defer"
Nyligen har jag arbetat med Angular 11, jag försöker göra en funktion som kontrollerar om kontot har tillåtelse att utföra en åtgärd, men jag måste få det varje gång det sker en ändring i SAS-token, det sagt, jag gjorde funktionerna nedan
/**
*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);
});
}
funktionen "hasPermissions" tar och kontrollerar om SAS har åtkomst till åtgärden som skickas som parameter och funktionen "HasActionPermission" anropar ovanstående funktion för att få ett booleskt värde
funktionen "HasActionPermission" går helt enkelt inte in i "return defer", vad kan det vara?
Svar #1
Omfamna observables. Du verkar gå fram och tillbaka mellan observables och promises, men detta verkar helt onödigt. Känn dig fri att anropa toPromise() efter att hasActionPermissions() har anropats.
Här är en omskrivning endast med 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);
}
Det är mycket renare, och det kommer att vara kallt tills du anropar subscribe() eller toPromise(), ingen behov av defer().
