У меня проблема async в моем приложении angularjs.
Я хочу, чтобы получить данные с удаленного сервера (в prefsService.js). А затем присвойте значения данных переменным в контроллере (в prefsController.js).
Вот файл prefsService.js:
(function() {
'use strict';
angular
.module('app')
.factory('PrefsService', PrefsService);
PrefsService.$inject = ['$resource','PrefsResource'];
function PrefsService($resource,PrefsResource) {
var initialize = function() {
var twentyFourHourTime = null;
var decimalTime = null;
var startDayOfWeek = null;
var roundingOption = null;
var roundingIncrement = null;
PrefsResource.get({key:"TwentyFourHourTime"}, function(data) {
if (data.result.value === null||undefined) {
twentyFourHourTime = 0;
} else {
twentyFourHourTime = data.result.value;
}
PrefsResource.get({key:"DecimalTime"}, function(data) {
if (data.result.value === null||undefined) {
decimalTime = 0;
} else {
decimalTime = data.result.value;
}
PrefsResource.get({key:"startDayOfWeek"}, function(data) {
if (data.result.value === null||undefined) {
startDayOfWeek = 0;
} else {
startDayOfWeek = data.result.value;
}
return {"twentyFourHourTime":twentyFourHourTime,"decimalTime":decimalTime,"startDayOfWeek":startDayOfWeek}
});
});
});
};
return {
initialize: initialize
};
}
})();
Вот файл prefsController.js:
vm.test=PrefsService.initialize();
console.log('Prefs data initialized', vm.test);
Когда я запускаю его, vm.test всегда "неопределен".
Что мне делать? Спасибо!
Я не проверял синтаксис, но суть его, как и при любом асинхронном программировании, является обещанием. Этот вопрос является обманом (кто может когда-либо найти главный обман этого типа вопроса?), Но здесь, как это сделать, используя угловые:
(function() {
'use strict';
angular
.module('app')
.factory('PrefsService', PrefsService);
PrefsService.$inject = ['$resource','PrefsResource'];
function PrefsService($resource,PrefsResource) {
var initialize = function() {
//return a promise
return $q
.all([
PrefsResource.get({key:"TwentyFourHourTime"}),
PrefsResource.get({key:"DecimalTime"}),
PrefsResource.get({key:"startDayOfWeek"})
])
.then(function(values) {
var
twentyFourHourTime = values[0],
decimalTime = values[1],
startDayOfWeek = values[2];
//return the value (object) when all promises have resolved
return {
"twentyFourHourTime":twentyFourHourTime.result.value || 0,
"decimalTime":decimalTime.result.value || 0,
"startDayOfWeek":startDayOfWeek.result.value || 0
}
})
}
return {
initialize: initialize
};
}
})();
PrefsService
.initialize()
//use the promise API to log messages only after the promise has resolved
.then(function(prefs) {
console.log('initialized');
console.log(prefs);
})