我正在构建一个简单的程序,它使用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({...
湾警报(温度)
℃。成功:功能(天气){...
为什么会这样?我知道如果我将警报(温度)置于成功:功能(天气){}那么它将返回当前温度,但这不是我想要的。
我最终希望变量温度保持当前温度,以便我可以在其他函数中使用此变量。例如,我希望能够根据温度值将“季节”设置为不同的字符串。
非常感谢任何帮助!
答案 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() {
}