订阅observable返回undefined

Sam*_*ham 6 javascript observable typescript angular2-services angular

所以我试图订阅一个从本地JSON文件返回数据的简单服务.

我已经设法使服务工作,我可以在函数中注销它,但是当我在angular 2组件中订阅服务时,它总是未定义的.我不知道为什么?任何帮助将非常感激.

API服务

export class ApiService {
   public data: any;

   constructor(private _http: Http) {
   }

   getData(): any {
       return this._http.get('api.json').map((response: Response) => { 
       console.log('in response', response.json()); //This logs the Object
       this.data = response.json();
       return this.data;
   })
   .catch(this.handleError);
   }
}
Run Code Online (Sandbox Code Playgroud)

零件

export class AppComponent {
   public data: any
   public informationData;

   constructor(private _api: ApiService) {}

   public ngOnInit(): void {
      console.log(this.getDataFromService()); // This return undefined
   }

   public getDataFromService() {
      this._api.getData().subscribe(response => {
          this.informationData = response;
          return this.informationData;
      });
   }
}
Run Code Online (Sandbox Code Playgroud)

Deb*_*ahK 30

也许有些图片有帮助?

这里的数字表示操作的顺序.

发送Http请求 在此输入图像描述

  1. 组件已初始化并调用movieService的getMovies方法.
  2. movieService getMovies方法返回一个Observable.不是此时的数据.
  3. 该组件调用subscribe返回的Observable.
  4. get请求被提交给服务器进行处理.
  5. ngOnInit方法已完成.

此后的任何代码subscribe都无法访问该movies属性,因为尚未返回数据.

收到Http响应 在此输入图像描述

在某个晚些时候......

  1. 电影将返回服务.
  2. 如果进程成功,则执行第一个回调函数.
  3. 本地电影属性被分配给从服务返回的电影.只有在这里才能最终设置电影属性.

在步骤#8之前尝试访问电影属性会导致错误.

我们可以在这里访问这个值吗?没有 在此输入图像描述

要解决这个问题: 在此输入图像描述

  • 这写得和演示得非常好。谢谢@DeborahK! (2认同)
  • 这不是这个例子的重点。调用“this.movi​​es.length”不会导致列表填充。调用`.subscribe`并设置`this.movi​​es = movie`会导致填充`this.movi​​es`。这篇文章试图说明为什么你无法获得可观察值之外的长度。尝试发布一个新问题并显示一些代码。标记我,我来看看。 (2认同)
  • 多么精彩的解释啊!任何与异步苦苦挣扎的人都应该看看这个回复。 (2认同)

Ami*_*mit -1

尝试使用:

getData(): any {
       return this._http.get('api.json');
}
Run Code Online (Sandbox Code Playgroud)

或者

   getData(): any {
           return this._http.get('api.json').map((response: Response) => { 
    response.json();
})
Run Code Online (Sandbox Code Playgroud)