Angular 2 Cannot read property 'subscribe' of undefined TypeError: Cannot read property 'subscribe' of undefined

Angular 2 Cannot read property 'subscribe' of undefined TypeError: Cannot read property 'subscribe' of undefined

我已经在 Whosebug 上尝试了很多关于修复此错误的提议,但现在我只需要问一下,因为我已经花了很多时间,现在一无所获。

我有这个简单的服务:

constructor(private http: Http, private tokenResolver: TokenResolver) {}

public getEventHistory(): Observable<heatmapElement[]> {

  this.tokenResolver.getToken(true).subscribe(token => {
    var headers = new Headers();
    headers.append('Authorization', 'Bearer ' + token);
    headers.append('Content-Type', 'application/json');

    this.result = this.http.get(this.restApi, new RequestOptions({headers: headers}))
        .map((res: Response) => res.json());
  });

  return this.result as Observable<heatmapElement[]>;
}

我想获取数据使用:

public demoData: heatmapElement[] =[];

getEventHistory(): void {
  this.eventHistoryService.getEventHistory()
                          .subscribe(data => this.demoData = data,);
}

这造成了一个我似乎无法修复的错误:

EXCEPTION: Uncaught (in promise): Error: Error in http://localhost:5555/app/dashboard/dashboard.html:13:8 caused by: Cannot read property 'subscribe' of undefined TypeError: Cannot read property 'subscribe' of undefined

非常感谢您的帮助, 谢谢

您不能 return async call 的结果超出其 subscribe 方法。

如果你想 return 从 getEventHistory() 观察到,你可以将 subscribe 更改为 mapswitchMap.

public getEventHistory(): Observable<heatmapElement[]> {

  return this.tokenResolver.getToken(true).switchMap(token => {
    var headers = new Headers();
    headers.append('Authorization', 'Bearer ' + token);
    headers.append('Content-Type', 'application/json');

    return this.http.get(this.restApi, new RequestOptions({headers: headers}));
  })
  .map((res: Response) => res.json() as heatmapElement[]);
}

尽管这可能很奇怪,但在我的例子中,在花了很多时间调试之后,结果证明,我使用的是 Output(@Output) EventEmitter 属性 来处理自定义事件,并且 Angular 在模板上传递时无法识别我的 属性 或自定义事件 属性:

例如

<custom-component (keydownEvent)="someFunctoin()"></custom-component>

执行上述操作的问题是(就我的问题而言)(keydownEvent) 不是有效的事件处理程序,但为什么它在开发中起作用而不是在您构建您的项目。更奇怪的是,ng build --prod 没有发出任何错误或警告!

解决方案

<custom-component keydown="someFunctoin()"></custom-component>

subscriber/subscription相关错误从何而来?

好吧,正如您想象的那样,有人订阅了 EventEmitter - 所以我想这就是相关性所在