2017-10-16 73 views
0

所以我试图订阅从本地JSON文件返回数据的简单服务。订阅observable正在返回undefined

我已经设法让服务工作,我可以在函数中注销它,但是当我订阅角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); 
    } 
} 

组件

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

'getDataFromService'本身并不返回任何东西。将'.subscribe'更改为'.map'并返回结果的可观察值,然后使用'|异步“在模板中解析它。 – jonrsharpe

+0

订阅功能不会返回数据。它返回一个'Subscription'对象。即如果你返回函数调用本身。 –

+0

@SurajRao是的,我注意到了这一点,我如何得到它返回响应数据? –

回答

-1

尝试用:

getData(): any { 
     return this._http.get('api.json'); 
} 

getData(): any { 
      return this._http.get('api.json').map((response: Response) => { 
    response.json(); 
}) 
0

您在同步和异步功能之间存在问题。你的问题是:getDateFromService是同步的,里面的内容是异步的。所以当ngOnInit函数调用getDataFromService时,你的代码不会等待异步任务。你的getDataFromService需要返回一个观察者或需要实现你的API的返回(你需要选择)。

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

public getDataFromService() { 
    return this._api.getData(); 
} 
+0

这很好,但是当我尝试将数据添加到类变量时,它仍然返回undefined –

+0

你想在哪里获得你的api的响应?因为你的问题在于你使用同步/异步功能。如果在你的类中有'undefined',那么你的类在执行'console.log'之前不会等待异步调用响应。 –

1

也许有些照片有帮助吗?

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

发送HTTP请求, enter image description here

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

这里subscribe之后的任何代码,因为该数据尚未返回不能访问movies属性。

收到HTTP响应 enter image description here

在某个时间稍后...

  • 的电影被返回给服务。
  • 如果进程成功,则执行第一个回调函数。
  • 将本地电影属性分配给从服务返回的电影。只是在这里,电影属性终于设置。
  • 尝试在步骤#8之前访问movies属性会导致错误。

    我们可以在这里访问这个值吗? NO enter image description here

    要解决这个问题: enter image description here

    0
    objResponse; 
    this.service.getData().subscribe((result: any)=> { 
    this.objResponse=result; 
    } 
    

    返回的东西不会要求