[英]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) => {}
)
);
}
在登录组件中,我无法订阅AuthenticationService的doLogin方法,因为在 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.