Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在Argular rxjs中注入另一个服务后的订阅问题_Angular_Rxjs - Fatal编程技术网

Angular 在Argular rxjs中注入另一个服务后的订阅问题

Angular 在Argular rxjs中注入另一个服务后的订阅问题,angular,rxjs,Angular,Rxjs,我有一个服务类NetworkService,其中我放置了所有常规restapi请求,如get、put、post、delete等,所有其他服务都使用此NetworkService方法执行操作。目前,我正在所有其他服务中使用网络服务的方法。我想知道有没有更好的方法,这样我就可以在组件中进行订阅,而不是在其他服务中。例如,对于登录,我使用的是AuthenticationService方法,即订阅NetworkService : AuthenticationService方法: doLogin(logi

我有一个服务类NetworkService,其中我放置了所有常规restapi请求,如get、put、post、delete等,所有其他服务都使用此NetworkService方法执行操作。目前,我正在所有其他服务中使用网络服务的方法。我想知道有没有更好的方法,这样我就可以在组件中进行订阅,而不是在其他服务中。例如,对于登录,我使用的是AuthenticationService方法,即订阅NetworkService :

AuthenticationService方法:

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) => {}
    )
  );
 }
}

网络服务方法:

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 {
   }
  }
}

如果有人知道tpo更好的方法,请在这里分享。谢谢

您不必在AuthenticationService中订阅。只需返回对NetworkService的调用,如果您对数据(如映射)有任何操作,只需在AuthenticationService中使用管道和其他rxjs操作符即可。Subscribe总是在管道的末尾使用(当您希望最终使用数据时),它通常位于组件中。因此,您的AuthenticationService将是:

doLogin(loginda):可观察{
让LoginParms={
客户端id:“应用程序”,
授权类型:“密码”,
密码:btoa(登录数据密码),
用户名:loginda.username,
};
this.networkService.postgetoken(loginparms);

}
您不必在AuthenticationService中订阅。只需返回对NetworkService的调用,如果您对数据(如映射)有任何操作,只需在AuthenticationService中使用管道和其他rxjs操作符即可。Subscribe总是在管道的末尾使用(当您希望最终使用数据时),它通常位于组件中。因此,您的AuthenticationService将是:

doLogin(loginda):可观察{
让LoginParms={
客户端id:“应用程序”,
授权类型:“密码”,
密码:btoa(登录数据密码),
用户名:loginda.username,
};
this.networkService.postgetoken(loginparms);

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


我建议阅读

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


我建议阅读

我想在doLogin中调用其他身份验证服务方法的身份验证服务(数据)=>{this.onPostGetTokenAccess(数据);},(error)=>{this.onPostGetTokenError(error);}我已经更新了相关代码。我怎么能调用它们呢?我不知道你在onPostGetTokenSuccess中做了什么,但只需将你在AuthenticationService中所做的整个订阅块移动到你的组件,在组件中注入AuthenticationService后,可以很容易地从组件的subscribe块内部调用OnPostGetTokenAccess,如:this.AuthenticationService.OnPostGetTokenAccess。在服务内部订阅不是最佳做法。而且一定要处理好退订的方法。您目前所做的工作并不总是有效的,您没有实现对服务的异步调用,因为它应该希望在身份验证服务的doLogin方法中调用身份验证服务的其他方法(数据)=>{this.onPostGetTokenAccess(data);},(error)=>{this.onPostGetTokenError(error);}我已经更新了有问题的代码。我怎么能调用它们呢?我不知道你在onPostGetTokenSuccess中做了什么,但只需将你在AuthenticationService中所做的整个订阅块移动到你的组件,在组件中注入AuthenticationService后,可以很容易地从组件的subscribe块内部调用OnPostGetTokenAccess,如:this.AuthenticationService.OnPostGetTokenAccess。在服务内部订阅不是最佳做法。而且一定要处理好退订的方法。您目前所做的工作并不总是有效的,您没有实现对服务的异步调用