更新全局变量:1。使用成员函数vs. 2.使用AJAX回调函数

时间:2014-09-21 22:00:34

标签: javascript jquery scope jquery-callback weather-api

背景:

我正在构建一个简单的程序,它使用simpleWeather.js API来提取程序其余部分使用的当前温度(http://simpleweatherjs.com/)。

更新的代码:

以下所有代码都在AngularJS控制器中,而simpleWeather.js文件在index.html文件中链接。

var _this = this;
    var seasons = null;

    function myAjaxCheck(callBack){
        $.simpleWeather({
        location: 'Calgary, CA',
        woeid: '',
        unit: 'c',
        success: function(weather) {
          var temperatureTemp = parseInt(weather.temp);
          callBack(temperatureTemp);
        }
      });
    }

    var temperature;

    myAjaxCheck(function(returnedTemperature){
        temperature = returnedTemperature;
        if (temperature > 20){
            _this.seasons = summerCollection; <-- summerCollection is an array strings
        }
    });

替代方案有效:

var _this = this;
    var seasons = null;

    var test = function(){
        _this.seasons = summerCollection;
    };

    test();

更新:问题:

似乎我可以使用成员函数test()更新全局变量,如第二段代码中所示。但是,为什么在第一段代码中没有使用AJAX回调函数更新全局变量?

我的HTML中有一个div,它使用ng-repeat来吐出summerCollection数组中的所有字符串。 它适用于第二段代码,但不适用于第一段代码。

非常感谢任何帮助!

有什么想法吗?

原始问题:

根据我从网络检查员那里收集的内容,看来这个代码加载的顺序是(它不应该):

一个。 $ .simpleWeather({...

湾警报(温度)

℃。成功:功能(天气){...

为什么会这样?我知道如果我将警报(温度)置于成功:功能(天气){}那么它将返回当前温度,但这不是我想要的。

我最终希望变量温度保持当前温度,以便我可以在其他函数中使用此变量。例如,我希望能够根据温度值将“季节”设置为不同的字符串。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

这是回调的本质 - 它们是异步的。代码应该按照您描述的顺序运行。

你正在做的事情是正确的,除了你的回调完成之前警报正在运行(应该如此)。

所以你需要做的是将你的警报(以及你想要运行的真实代码)放入回调中:

var temperature = null; <-- this variable should store the temperature retrieved by simpleWeather API
var seasons = null;

$.simpleWeather({
    location: 'Calgary, CA',
    woeid: '',
    unit: 'c',
    success: function(weather) {
      temperature = parseInt(weather.temp); <-- Temperature variable defined outside this scope
      alert(temperature);

      // call your remaining code here, which will run after the temperature has been set.
      some_other_function();
    }
  });

function some_other_function() {
}