我正在研究地理定位的Google地图项目。我编写了一个简单的API,并上传了服务器。我可以通过以下方式获取api的数据:
export class Tab2Page implements OnInit, AfterContentInit {
getLat: any;
getLong: any;
constructor(private geolocation: Geolocation, public http: HttpClient) {
this.http.get("apilink").subscribe(data =>
{
this.getLat = data["lat"];
this.getLong = data["long"];
});
console.log(this.getLat); //gives undefined
}
}
但是,当我想从任何函数中或在this.http.get()之外访问getLat和getLong变量时,该变量给出未定义。我该怎么办?我尝试了静态,常量,全局,var声明等。
ngAfterContentInit(): void {
console.log(this.getLat); //gives undefined
}
答案 0 :(得分:0)
这样做的原因是,最初getLat
和getLong
都为空,这给undefined
是因为您尚未为其分配任何值。
为什么此功能在内部订阅?
这是因为当返回来自HTTP请求的响应时。这两个变量都使用
分配了值this.getLat = data["lat"];
this.getLong = data["long"];
为什么在订阅之外无法使用?
这是因为subscribe
中的代码是异步的,即它将在程序的常规执行之外运行,并且仅在HTTP请求返回响应时才运行。由于HTTP请求需要一些时间才能完成,并且您的console.log
首先执行,因此结果为undefined
您可以做什么?
如果您要执行一段需要getLat
和getLong
值的代码,则可以在subscribe
方法内调用该函数,或者如果您需要外部的这些值零件,
您可以创建一个Subject
,然后在您的subscribe
中向该Subject
发送数据,然后在您的代码中就可以subscribe
答案 1 :(得分:0)
它是由于异步请求而发生的。
this.http.get("apilink").subscribe(data => // this started to execute but due to async request it will update once you get confirmation.
{
this.getLat = data["lat"];
this.getLong = data["long"];
});
console.log(this.getLat); //gives undefined (This executed before request return)
您的HTTP请求刚刚开始执行,但在控制台完成执行之前,原因是您的 http请求是异步的。
因此请确保其已同步或使用$.when $.then
内的$(then)
调用控制台