繁体   English   中英

在 angular rxjs 中注入另一个服务后订阅问题

[英]subscribing issue after Injecting another service in service in angular rxjs

我有一项服务 class NetworkService ,我将所有常规rest api 请求(如获取、放置、发布、删除等)和所有其他服务都使用此NetworkService方法执行操作。 目前,我正在订阅所有其他服务中的NetworkService方法。 我想知道是否有更好的方法可以做到这一点,以便我可以在组件中而不是在其他服务中进行订阅。 例如,对于登录,我使用的是AuthenticationService方法,它订阅NetworkService的方法:

身份验证服务方法:

doLogin(loginData) {
 let loginParams = {
   client_id: "app",
   grant_type: "password",
   password: btoa(loginData.password),
   username: loginData.username,
 };

 this.networkService.postGetToken(loginParams).subscribe(
  (data) => {
    this.onPostGetTokenSuccess(data);
  },
  (error) => {
    this.onPostGetTokenError(error);
  }
 );

}

网络服务方法:

postGetToken(dataParam) {
   //Used only for Login
   let options = {
     headers: {
       "Content-Type": "application/x-www-form-urlencoded",
     },
   };

   let data = { params: dataParam };

   return this.http
     .post(
       this.baseurl +"svf/zsv/oauth/oauth20/token",
    data,
    options
  )
  .pipe(
    map(
      (data) => {},
      (error) => {}
    )
  );
 }

登录组件中,我无法订阅AuthenticationServicedoLogin方法,因为在 AuthenticationService 我已经订阅了NetworkService的方法,并且很难在登录组件中获得结果。 在登录组件中,我这样做如下:

performlogin() {
   if (!this.loginForm.valid) {
    return false;
   } else {
   this.loaderService.showLoader();

  let data = this.authenticationService.doLogin(this.loginForm.value);
   if (data["access_token"]) {
   
   } else {
   }
  }
}

如果有人知道更好的方法,请在此处分享。 谢谢

您不必订阅 AuthenticationService。 只需返回对您的 NetworkService 的调用,如果您对数据进行任何操作,例如。 映射,只需 pipe 并在 AuthenticationService 中使用其他 rxjs 运算符。 订阅总是在 pipe 的末尾使用(当您想最终使用您的数据时),这通常在您的组件中。 因此,您的 AuthenticationService 将是:

 doLogin(loginData): Observable<Type of data returned>{ let loginParams = { client_id: "app", grant_type: "password", password: btoa(loginData.password), username: loginData.username, }; this.networkService.postGetToken(loginParams); }

这似乎是 Http 拦截器的众多用例之一

推荐阅读官方文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM