2017-04-03 2 views
3

내 관찰 결과에 가입하면 내 subscribeToTasks() 호출이 실패하고 내 장치에서 내 subscriptionError() 메서드의 코드가 궁극적으로 호출됩니다. 간단한 경고. 문제는 언제 내 브라우저 콘솔에서 다음과 같은 오류가 발생,이 호출에 오류가 발생하고 this.newSubscriptionFailure.next()가 호출됩니다입니다 :정의되지 않은 'next'속성을 읽을 수 없습니다.

정의되지 않은 newSubscriptionFailure 얼마나 '다음'정의되지 않은

의 속성을 읽을 수 없습니다 메소드 위에 정의 된 것을 명확하게 볼 수있을 때? api 호출 오류가 발생하기 전에 해당 코드가 오래 동안 나타납니다. 나는이 접근법을 과거에 사용했고 항상 효과가있었습니다. 내가 생각할 수있는 유일한 차이점은 서비스에서 .next() (newSubscriptionFailure이 정의 된 것과 동일한 파일)을 호출하는 것입니다. 반면에 나는 보통 .next()을 별도의 구성 요소 파일 . 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이 방법을 사용할 수있는 방법이 있습니까? 더 좋은 방법이 있습니까? 내 서비스에서

코드 : 내 구성 요소에서

import { Observable } from 'rxjs/Observable'; 
import { Subject } from 'rxjs/Subject'; 

public subscribeToTasks(period: string, stripeToken: string): Observable<any> {   
    let body = JSON.stringify({ period, stripeToken }); 
    let headers = new Headers({ 'Content-Type': 'application/json' }); 
    let options = new RequestOptions({ headers: headers });   
    return this.authHttp.post(this.apiTasks, body, options).map(response => { 
     return response.json(); 
    }).catch(this.newSubscriptionError); 
} 


newSubscriptionFailure = new Subject(); 
newSubscriptionFailure$ = this.newSubscriptionFailure.asObservable(); 

public newSubscriptionError() { 
    this.newSubscriptionFailure.next(); 
} 

코드 :

ngOnInit(): void { 
    this.subscriptionError(); 
} 

subscriptionError(){ 
    this.subscriptionsService.newSubscriptionFailure$.subscribe(() => { 
     alert('call failed'); 
    }); 
} 

답변

6

변경

}).catch(this.newSubscriptionError); 

}).catch((e)=>this.newSubscriptionError()); 

또는

}).catch(this.newSubscriptionError.bind(this)); 

당신의 this 경우 다른 사람에서 Injectable 그렇지 않으면

+1

this.newSubscriptionError.bind (this) fixed, 나에게 고마워! – Brett

0

로 다스 려하지 않는 것은 내가 가진 동일한 문제가 있습니다. OnDestroy 메서드에서 this.destroy $라는 제목을 사용하여 다음에 호출합니다. subscribable observable에서 다음과 같이 사용하십시오 : .takeUntil(this.destroyed$). 나는이 파괴적인 $ 객체를 초기화하는 것을 잊었다. destroy$: Subject<any> = new Subject<any>();을 사용한 후 오류가 사라졌습니다.