2014-09-21 3 views
0

фона:

Я строю простой программы, которая использует simpleWeather.js API, чтобы тянуть в текущей температуры, который будет использоваться остальная часть программы (http://simpleweatherjs.com/).Обновление глобальной переменной: 1. С помощью функции-члена vs. 2. Использование функции обратного вызова AJAX

Обновленный код:

Все ниже код находится в пределах контроллера 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(); 

UPDATE: Проблема:

кажется, что я могу обновить глобальную переменную тестирования функции члена(), как во 2-й фрагмент кода. Однако почему глобальная переменная не обновляется с помощью функции обратного вызова AJAX в первом фрагменте кода?

У меня есть div в моем HTML, который использует ng-repeat, чтобы выплюнуть все строки в массиве summerCollection. Он работает со вторым фрагментом кода, но не с первым.

Любая помощь очень ценится!

Любые идеи?

Оригинал Проблема:

Из того, что я собрал из веб-инспектора, оказывается, что порядок, в котором этот код нагрузок (который не должен):

а. $ .simpleWeather ({...

б оповещения (температура)

с успехом:..? Функция (погода) {...

Любые идеи, почему это я знаю, что если я ставлю (погода) {}, тогда он вернет текущую температуру, но это не то, что я хочу.

В конечном итоге я хочу, чтобы переменная температура удерживала текущую температуру, чтобы я мог использовать эта переменная в других функциях. Например, я хочу иметь возможность устанавливать «сезоны» в разные строки в соответствии с значением температуры.

Любая помощь очень ценится!

ответ

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() { 
} 
+0

Спасибо за ваши советы. Я попытался реализовать это, однако я столкнулся с новой проблемой. Я обновил вопрос, не могли бы вы взглянуть и сообщить мне, что вы думаете? Спасибо – justinSYDE

+0

, если вы положили console.log (returnTemperature) в качестве первой строки обратного вызова (перед установкой глобального), показывает ли она правильную температуру? – manishie

+0

Да, это показывает правильную температуру – justinSYDE