Я пытаюсь получить некоторые данные из URL-адреса, сохранить их в переменной и вернуть в свой контроллер. Но проблема в том, что данные из URL обрабатываются после того, как переменная уже возвращена контроллеру (который вызывает функцию). Я вызываю URL-адрес службы в своем Service.js. Вот как я это делаю:
var demoService = angular.module('demoService', []).service('myService', function($http, $q) {
var gaugeData = {
maxValue: 5000,
animationSpeed: 100,
val: 5000
};
console.log(gaugeData);
var deferred = $q.defer();
$http.get('http://myurl').then(function(data) {
console.log(data.data.Tweets[3].FAVOURITE_COUNT);
var gaugeData = {
maxValue: 5000,
animationSpeed: 100,
val: data.data.Tweets[3].FAVOURITE_COUNT
};
deferred.resolve(gaugeData);
console.log(gaugeData);
});
this.get = function() {
deferred.promise.then(function(data) {
console.log(data);
gaugeData.val = data.val;
});
return gaugeData;
};
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds) {
break;
}
}
}
this.list = function() {
return gaugeData;
};
});
Контроллер ожидает данные в той же форме, что и объект gaugeData
, но поскольку gaugeData
заполняется служебными данными после того, как значение уже возвращено, контроллер не показывает объект (undefined). Консоль выглядит так:
Object {maxValue: 5000, animationSpeed: 100, val: 5000}
controllers.js:202 $…t.l.$…w.a.$…e.$$ChildScope {$$childTail: null, $$childHead: null, $$nextSibling: null, $$watchers: null, $$listeners: Object…} (console.log); from controller
app.js:15 TypeError: Cannot read property 'maxValue' of undefined (since an empty value is passed)
1566
services.js:137 Object {maxValue: 5000, animationSpeed: 100, val: 1566}
services.js:144 Object {maxValue: 5000, animationSpeed: 100, val: 1566}
Ясно, что элемент управления сначала входит в службу, а затем во время обработки URL-адреса элемент управления переходит к элементу управления и принимает пустое значение, и после того, как это произошло, URL-адрес обрабатывается, и gaugeData
заполняется значениями из URL-адреса службы. Я попытался сделать это без обещания и отложил. Я просто использовал $http.get(url).success(function(){code});
Как я могу передать свои данные URL в переменную и правильно передать их контроллеру в нужное время?
Также вот фрагмент кода моего контроллера, где я вызываю сервисную функцию:
console.log($scope);
return $scope.gaugeHome ={
gaugeData:
myService.get(), .....
this
внутриthen
- это объект окна, это ошибка в строгом режиме - запустите свой код в строгом режиме :) - person Benjamin Gruenbaum   schedule 27.05.2015this
внутриthen
. Просто был плохой отступ (сейчас исправлено). ;-) - person Gabriel L.   schedule 28.05.2015