从服务返回字符串

时间:2018-10-30 13:43:31

标签: angular rxjs

我有一个服务的方法,该方法应该返回一个字符串,但是它返回一个“ Subscriber”: enter image description here

服务:

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]);
        });
    });
};

请指教!谢谢!

2 个答案:

答案 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,该值将在视图上更新。

Angular http reference

答案 1 :(得分:0)

您要在此处返回订户

 return this.privilegePageService.getAllPrivilegesPage().subscribe....

这就是您得到的-订阅者(或订阅)。