繁体   English   中英

如何链接/组合可观察物

[英]How to chain/combine Observables

好的,这困扰了我一段时间,想知道是否有人可以向我展示一种在多个服务之间链接Observable的好方法。

在下面的Auth类示例中,从this.api.postSignIn()创建Observable的一种好方法是什么,以便signInSubmit()可以在组件中重新订阅它? 值得注意的是this.api.postSignIn()正在订阅Angular2 http请求。

这是一种反模式吗?是否有更好的方法可以做到这一点?

基本上,我想实现的功能是:

  • 组件-负责收集登录数据并将其以正确的格式发送到auth服务。 然后,完成身份验证登录后,导航至管理页面。
  • 服务-进行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() { } } 

我会利用docatch运算符,而不是在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方法返回一个订阅,而不是一个可观察的。 所以你不能订阅...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM