如何 chain/combine Observables
How to chain/combine Observables
好的,这已经困扰我一段时间了,想知道是否有人可以告诉我一种在多个服务之间链接 Observables 的好方法。
在下面的 Auth class 示例中,从 this.api.postSignIn()
创建 Observable 以便 signInSubmit()
可以在组件中订阅它的好方法是什么?值得注意的是 this.api.postSignIn()
正在订阅 Angular2 http 请求。
这是否有点反模式,有更好的方法吗?
基本上我想实现的功能是:
- 组件 - 负责收集登录数据并以正确的格式将其发送到身份验证服务。然后,一旦 Auth 登录完成,导航到管理页面。
服务 - 进行 api 调用以获取令牌,通过令牌服务设置令牌并设置 isSignedIn
布尔值,然后将控制权交还给调用组件。
@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() {
}
}
我会利用 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
方法 returns 是订阅而不是可观察对象。所以你不能订阅它...
好的,这已经困扰我一段时间了,想知道是否有人可以告诉我一种在多个服务之间链接 Observables 的好方法。
在下面的 Auth class 示例中,从 this.api.postSignIn()
创建 Observable 以便 signInSubmit()
可以在组件中订阅它的好方法是什么?值得注意的是 this.api.postSignIn()
正在订阅 Angular2 http 请求。
这是否有点反模式,有更好的方法吗?
基本上我想实现的功能是:
- 组件 - 负责收集登录数据并以正确的格式将其发送到身份验证服务。然后,一旦 Auth 登录完成,导航到管理页面。
服务 - 进行 api 调用以获取令牌,通过令牌服务设置令牌并设置
isSignedIn
布尔值,然后将控制权交还给调用组件。@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() { } }
我会利用 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
方法 returns 是订阅而不是可观察对象。所以你不能订阅它...