我正在使用ngx-permissions处理Angular 6应用程序中的权限。我想在从端点检索数据之前检查用户的权限。 Ngx-permissions提供了一种在hasPermission(permissionName)方法中检查用户许可的方法。这将返回一个承诺。我想使用Observable从端点检索数据,因为我已阅读这是Angular的处理方式。但是我不确定如何将权限检查中的Promise和Observable方法结合起来。
服务:
getData(): Observable<Item[]<>>{
this.permissionsService.hasPermission(Permission.CanViewData)
.then(hasPermission => {
if (hasPermission) {
return this.http.get<Item[]>('http://endpoint/getdata', httpOptions).pipe(
map(this.extractData), // this is calculated too late
catchError(e => this.handleError(e, 'GetData', new Observable<Item[]>()))
);
}
});
return new Observable<Item[]>(); // this is always passed to the component
}
组件:
getData(): void {
this.service.getData().subscribe(data => {
this.data = data
});
}
我意识到我没有正确地调用hasPermission方法,因为我的代码始终会进入最后的return new Observable<Item[]>();
。但是,数据是从端点检索的-如果添加console.log,我可以看到map(this.extractData)
的结果。它只是计算为时已晚。该组件已经运行,并且正在使用空的Item[]
。
在尝试检索数据并仍将Observable返回给我的组件之前,如何使用ngx-permissions中的PermissionsService.hasPermission检查用户的权限?
答案 0 :(得分:0)
是的,根据记录,这是一个更一般的rxjs问题。无论如何,您必须将promise转换为observable,然后像这样链接调用:
import { of, from, Observable } from 'rxjs';
import { map, filter, flatMap } from 'rxjs/operators';
class Caller {
public constructor(){}
public call() : Observable<Item[]> {
//the promise returned from your method it has to be typed with boolean
var permission = new Promise<boolean>(function(resolve, reject) {
setTimeout(function() {
resolve(true);
}, 300);
});
//calling from(prommisse) converts promes to observable.\
return from(permission)
.pipe(
filter(t => t), //just a trick to avoid if statemt in the flatMap call
flatMap( t => {
//call your http get method here
var it:Item = {property: "1"};
return of<Item[]>([it])
}))
}
}
export class Item {
property: String
}