Angular 在Argular rxjs中注入另一个服务后的订阅问题
我有一个服务类NetworkService,其中我放置了所有常规restapi请求,如get、put、post、delete等,所有其他服务都使用此NetworkService方法执行操作。目前,我正在所有其他服务中使用网络服务的方法。我想知道有没有更好的方法,这样我就可以在组件中进行订阅,而不是在其他服务中。例如,对于登录,我使用的是AuthenticationService方法,即订阅NetworkService : AuthenticationService方法:Angular 在Argular rxjs中注入另一个服务后的订阅问题,angular,rxjs,Angular,Rxjs,我有一个服务类NetworkService,其中我放置了所有常规restapi请求,如get、put、post、delete等,所有其他服务都使用此NetworkService方法执行操作。目前,我正在所有其他服务中使用网络服务的方法。我想知道有没有更好的方法,这样我就可以在组件中进行订阅,而不是在其他服务中。例如,对于登录,我使用的是AuthenticationService方法,即订阅NetworkService : AuthenticationService方法: doLogin(logi
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) => {}
)
);
}
在登录组件中,我无法订阅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 {
}
}
}
如果有人知道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。在服务内部订阅不是最佳做法。而且一定要处理好退订的方法。您目前所做的工作并不总是有效的,您没有实现对服务的异步调用