2016-06-27 2 views
1

Хорошо, это меня искажает какое-то время, задаваясь вопросом, может ли кто-нибудь показать мне хороший способ цепочки. Наблюдения между несколькими службами.Как связать/объединить Observables

В приведенном ниже примере в классе Auth было бы хорошим способом создания наблюдаемого из this.api.postSignIn(), так что 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() { 
    
        } 
    } 
    

ответ

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 возвращает подписки и не наблюдаемой. Таким образом, вы не можете подписаться на него ...

+0

Спасибо, прочитайте на .do() и .catch() и узнайте, как он отличается от subscribe(). –

+0

Добро пожаловать! Разница в использовании операторов заключается в том, что они позволяют подключать обработку к асинхронному потоку данных. При подписке вы «просто» получаете события (ошибки и завершение) на наблюдаемом. Этот удивительный учебник будет полезен для понимания этого: https://gist.github.com/staltz/868e7e9bc2a7b8c1f754. –