无法读取未定义

时间:2017-04-03 18:20:14

标签: angular rxjs

我正在订阅一个observable,以便在我的服务中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');
    });
}

2 个答案:

答案 0 :(得分:9)

更改

}).catch(this.newSubscriptionError);

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

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

您的this未引用Injectable否则

答案 1 :(得分:1)

如果其他人遇到同样的问题。我正在使用一个名为this.destroy $的主题,我接下来在OnDestroy方法中调用它。在订阅的observable中使用它,如:.takeUntil(this.destroyed$)。我忘了初始化这个destroy $对象。使用destroy$: Subject<any> = new Subject<any>();后,错误就消失了。