【问题标题】:How to chain/combine Observables如何链接/组合 Observables
【发布时间】:2016-06-27 19:13:18
【问题描述】:

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

在下面的 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() {
    
       }
    }
    

【问题讨论】:

    标签: javascript angular rxjs observable rxjs5


    【解决方案1】:

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

    【讨论】:

    • 感谢阅读 .do() 和 .catch(),并了解它与 subscribe() 有何不同。
    • 不客气!使用运算符的不同之处在于它们允许您将处理插入到异步数据流中。通过订阅,你“简单地”接收到 observable 上的事件(错误和完成)。这个很棒的教程将有助于理解这一点:gist.github.com/staltz/868e7e9bc2a7b8c1f754.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2019-03-17
    • 1970-01-01
    • 2014-12-20
    • 2018-01-03
    • 2016-06-26
    相关资源
    最近更新 更多