可观察函数忽略代码 "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()
.
最近我正在使用 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()
.