离子框架全局变量

时间:2019-06-06 11:44:55

标签: angular ionic-framework

我正在研究地理定位的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
}

2 个答案:

答案 0 :(得分:0)

这样做的原因是,最初getLatgetLong都为空,这给undefined是因为您尚未为其分配任何值。

为什么此功能在内部订阅?

这是因为当返回来自HTTP请求的响应时。这两个变量都使用

分配了值
this.getLat = data["lat"];
this.getLong = data["long"];

为什么在订阅之外无法使用?

这是因为subscribe中的代码是异步的,即它将在程序的常规执行之外运行,并且仅在HTTP请求返回响应时才运行。由于HTTP请求需要一些时间才能完成,并且您的console.log首先执行,因此结果为undefined

您可以做什么?

如果您要执行一段需要getLatgetLong值的代码,则可以在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)调用控制台