2016-06-27 8 views
1

Ok 이것은 여러 서비스 사이에서 Observables를 연결하는 좋은 방법을 보여줄 수 있는지 궁금합니다.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() { 
    
        } 
    } 
    

답변

2

내가 대신 signIn 방법 내에서 가입의 docatch 연산자를 활용하는 것입니다. subscribe 방법은 가입 및 관찰되지를 반환하기 때문에 귀하의 경우에는

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); 
      } 
     ); 
} 

, 당신은이 방법의 반환 된 객체에 등록 할 수 없습니다 :

다음은 리팩토링 signIn 방법이다. 따라서 구독 할 수는 없습니다 ...

+0

감사합니다 .do() 및 .catch()를 읽고 subscribe()와 다른 점을 확인하십시오. –

+0

여러분을 환영합니다! 연산자 사용의 차이점은 처리자를 비동기 데이터 흐름에 연결할 수 있다는 것입니다. 구독하면 관찰 대상에 대한 이벤트 (오류 및 완료)가 "간단하게"수신됩니다. 이 멋진 튜토리얼을 이해하는 데 도움이 될 것입니다 : https://gist.github.com/staltz/868e7e9bc2a7b8c1f754. –

관련 문제