无法将函数生成的数据存储到JavaScript中的全局变量中

时间:2017-04-22 08:43:06

标签: javascript

我正在尝试将我从api获取的天气数据存储到全局变量中,但是却未定义。 我做错了什么? 以下是我的代码。

var Data ;

var GetData = function(){

    this.findLocation = function(position)
    {
        this.latitude = position.coords.latitude.toFixed(2);
        this.longitude = position.coords.longitude.toFixed(2);
        this.getWeatherData = function(lat,lon){

            var xhr = new XMLHttpRequest();
            xhr.open("GET", "http://api.openweathermap.org/data/2.5/weather?lat="+lat+"&lon="+lon+"&units=metric&APPID=2048abd4ff09cb4aa1f62dc9a077ba6", false);
            xhr.send();
            var data = xhr.response;
            return this.wData = JSON.parse(data);
        };
        Data = this.getWeatherData(this.latitude,this.longitude);

    };


    navigator.geolocation.getCurrentPosition(this.findLocation);

};


GetData();
console.log(Data);

1 个答案:

答案 0 :(得分:0)

您的代码中有几个问题,ANMo ......

使您的代码异步

首先,您不应该使用同步请求来调用外部API。在开发人员文档(MDN)中了解Mozilla对此做法的看法:

  

从Gecko 30.0开始(Firefox 30.0 / Thunderbird 30.0 /   SeaMonkey 2.27),主线程上的同步请求已经完成   由于对用户体验的负面影响而弃用。

您绝对应该重构代码以使其异步。这就是Ajax的工作原理......

避免全局变量

在JavaScript中使用全局变量是一个糟糕的主意。您应该尽可能保持全局范围的清洁,以避免意外冲突。

正确使用构造函数

在您的代码中,您尝试使用构造函数,但将其称为基本函数。如果要从构造函数创建实例,则必须使用WorkDayUsageBlock = [HourlyUsageBlock.copy() for x in range(12)] 关键字。