如何链接/组合Observable

时间:2016-06-27 19:13:18

标签: javascript angular rxjs observable rxjs5

好的,这已经困扰了我一段时间,想知道是否有人能告诉我在多个服务之间链接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() {
    
       }
    }
    

1 个答案:

答案 0 :(得分:2)

我会利用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方法返回订阅而不是可观察对象。所以你不能订阅它......