2017-05-24 87 views
1

我有一个简单的场景: 我想将从服务返回的数组存储到类变量中。在我存储数据之前,如何等待数据可用?如果我等待一段时间(用settimeout测试),它就可用。等待订阅完成

服务:

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()); 
} 

客户端订阅:

getEventHistory(): void { 
this.eventHistoryService.getEventHistory() 
         .subscribe(data => this.heatmapData = data, 
            error => console.log('Error in Heatmap get data: ' + <any> error) 
         ); 

console.log('HeatmapData: '+ this.heatmapData.toString()); <---- Undefined and causes error 
} 

的数据是可用的,如果我等待一段时间......但不应该以这种方式是必要的应该是...

ngOnInit(): void { 
    this.getEventHistory(); 
    setTimeout(() => { 
     console.log('HeatmapData: '+ this.heatmapData.toString()); 
    },3000); 
    } 
+0

研究[我如何返回从angular2可观察/ HTTP /异步调用的响应?(可能的复制https://stackoverflow.com/questions/43055706/how-do-i-return-the -response-from-an-observable-http-async-call-in-angular2) – Alex

+0

您的代码结构有缺陷。你的'getEventHistory()'方法应该返回一个可观察值(即不要在该方法内部进行订阅)。你只需要订阅什么时候需要数据,你的情况是在'ngOnInit()'中。 – AngularChef

回答

0

你可以在complete()函数中完成它。这样做可以确保数据首先到达。

getEventHistory(): void { 
    this.eventHistoryService.getEventHistory() 
          .subscribe(data => this.heatmapData = data, 
             error => console.log('Error in Heatmap get data: ' + <any> error), 
             () => console.log('HeatmapData: '+ this.heatmapData.toString()); 
          ); 

    } 
+0

嗨,谢谢你的回复,我已经试过了,并且不起作用。还要在处理数据时分配临时变量,然后将其保存到成员变量中。 由于某种原因oncomplete永远不会被调用,至少没有输出。 – jibjapda

+0

完整的函数没有被解雇?如此extrange –