好的,这已经困扰了我一段时间,想知道是否有人能告诉我在多个服务之间链接Observable的好方法。
在下面的Auth类示例中,从this.api.postSignIn()
创建Observable的好方法是什么,以便signInSubmit()
可以在组件中订阅它?值得注意的是this.api.postSignIn()
正在订阅Angular2 http请求。
这是一种反模式,还有更好的方法吗?
基本上我想要实现的功能是:
服务 - 进行api调用以获取令牌,通过令牌服务设置令牌并设置isSignedIn
bool,然后将控制权推迟回调用组件。
@Component({...})
export class SignIn {
private signIn:SignInModel = new SignInModel();
constructor(private auth:Auth, private router:Router) {
}
ngOnInit() {
}
signInSubmit() {
this.auth.signIn(this.signIn)
.subscribe(
() => {
this.router.navigate(['/admin']);
}
)
}
}
@Injectable()
export class Auth {
private isSignedIn:boolean = false;
constructor(private api:Api, private tokenService:TokenService) {
}
public signIn(signIn:SignInModel) {
return this.api.postSignIn(signIn)
.subscribe(
response => {
this.tokenService.set(new TokenModel(response.token));
this.isSignedIn = true;
},
error => {
console.log(error);
}
);
}
public signOut() {
}
}
答案 0 :(得分:2)
我会利用do
和catch
运算符,而不是在signIn
方法中订阅。
以下是重构的signIn
方法:
public signIn(signIn:SignInModel) {
return this.api.postSignIn(signIn)
.do(
response => {
this.tokenService.set(new TokenModel(response.token));
this.isSignedIn = true;
})
.catch(
error => {
console.log(error);
}
);
}
在您的情况下,您无法订阅此方法的返回对象,因为subscribe
方法返回订阅而不是可观察对象。所以你不能订阅它......