我有一个服务的方法,该方法应该返回一个字符串,但是它返回一个“ Subscriber”:
服务:
getRedirectPage = (role) => {
let destinationPage = null;
return this.privilegePageService.getAllPrivilegesPage().subscribe(data => {
this.privilegePage = data;
return this.userService.getUserRolesList().subscribe(data => {
let currentRole = data.filter(x => x.name === role.name)[0];
currentRole = this.sortPagePrivileges(currentRole);
// Partial fix for ROLES without privileges
loop1:
for(let priv of currentRole.privileges) {
loop2:
for(let privPage of this.privilegePage) {
if(priv.name == privPage["privileges"] + "_PRIVILEGE") {
destinationPage = privPage["page"];
break loop1; // Breaking out from both loops
}
}
}
return destinationPage;
}, error => this.errorHandler.handleError(error));
});
}
组件:
redirectOnRole = (role) => {
let destinationPage = this.redirectPageService.getRedirectPage(role);
console.log("destinationPage: ", destinationPage);
}
因此返回的destinationPage
必须是字符串。您能告诉我我在做什么错吗?谢谢!
更新:
如果我这样将它放入组件中:
this.redirectPageService.getRedirectPage(role).subscribe(let destinationPage = data);
我收到一条错误消息,内容为Property 'subscribe' does not exist on type 'Subscription'.
,这就是为什么我尝试不使用subscribe...
的原因。
我要从另一个服务中返回一种方法,该服务也要我订阅,这就是为什么它不起作用的原因:return this.privilegePageService.getAllPrivilegesPage().subscribe(data => {...
更新2
我设法从服务中获取数据作为Observable并将其订阅到组件中,但是我想改进自己的方式。进入组件后,我在另一个Observable中获得了一个Observable,我想知道是否可以更改它以将数据接收到主Observable中。这是我的代码:
服务:
getRedirectPage = (role):Observable<any> => {
let destinationPage = null;
return from(this.privilegePageService.getAllPrivilegesPage().map(data => {
this.privilegePage = data;
return this.userService.getUserRolesList().map(data => {
let currentRole = data.filter(x => x.name === role.name)[0];
currentRole = this.sortPagePrivileges(currentRole);
// Other code / assign a string to 'destinationPage'
return destinationPage;
}, error => this.errorHandler.handleError(error));
}));
}
组件:
redirectOnRole = (role) => {
this.redirectPageService.getRedirectPage(role).subscribe(data => {
data.subscribe(destinationPage => {
this._router.navigate([destinationPage]);
});
});
};
请指教!谢谢!
答案 0 :(得分:0)
任何Web应用程序中的常见操作是获取或发布数据 到服务器。 Angular应用程序通过Http库实现了这一点,该库 以前使用Promises以异步方式运行。的 更新的Http库现在包含了可观察的触发器 事件和获取新数据
Http库的通用例程(例如get,post,put和delete所有返回的Observables)使我们可以异步处理任何结果数据。
组件
redirectOnRole = (role) => {
this.redirectPageService.getRedirectPage(role).subscribe(x=> {
let destinationPage = x;
});
}
服务 将您的服务更改为以具有更好可读性的方法返回observable。
这是仅显示概念的伪代码。 我还没有使用过IDE,所以它包含拼写错误和语法错误
getRedirectPage(role:yourType) :Observable<string> {
Observable.forkJoin(
this.privilegePageService.getAllPrivilegesPage().map((res:Response) => res.json()),
this.userService.getUserRolesList()
.flatMap((response) => response.json())
.filter((x) => x.name==role.name)
).subscribe(
data => {
this.privilegePage = data[0]
this.role= data[1]
if(your condition) {
return // string observable.
}
},
err => console.error(err)
);
}
工作原理
该组件通过订阅此服务方法返回的Observable来启动实际的GET操作。
服务器成功响应结果后,组件将为其分配destinationPage
,该值将在视图上更新。
答案 1 :(得分:0)
您要在此处返回订户
return this.privilegePageService.getAllPrivilegesPage().subscribe....
这就是您得到的-订阅者(或订阅)。