Я новичок в угловой и не слишком сильный в javascript для начала. Я пытаюсь создать приложение с использованием ионной структуры. И я пытаюсь получить список из json файла. Я успешно работал с сырым json в переменной. Но теперь я пытаюсь использовать $http.get()
для извлечения его из удаленного файла в папке проекта.
.service('staffServices', ['$q', '$http', staffService]);
function staffService($q, $http) {
var staffs = {};
var promise = $http.get("/js/jsons/settings.json")
.success(function(response) {
staffs = response.staffSettings;
console.log(staffs); //HAS WHAT I NEED
});
console.log(staffs); //EMPTY OBJECT
return {
loadAllSettings: function () {
return $q.when(staffs);
},
query: function (params) {
return filterFilter(staffs, params);
},
get: function (params) {
return this.query(params)[0];
}
}
};
По какой-то причине я не могу получить доступ к результату вне функции .success()
. Я не уверен, связано ли это с моим незнанием в javascript или статусе моего новичка в угловом. Пожалуйста, помогите мне
Это мой контроллер ниже. self.settings
никогда не заполняется и всегда возвращает пустой объект
.controller("staffCtrl", function (staffServices) {
var self = this;
self.settings = [];
staffServices.loadAllSettings()
.then(function (settings) {
self.settings = [].concat(settings);
console.log(settings);
});
});
Я считаю, что проблема заключается в том, как вы обрабатываете $ q и обещание, вы можете попробовать это также:
// Removed irrelevant return functions temporarily
.service('staffServices', ['$q', '$http', staffService]);
function staffService($q, $http) {
var deferredPromise = $q.defer();
var staffs = {};
var promise = $http.get("/js/jsons/settings.json")
.success(function(response) {
staffs = response.staffSettings;
console.log(staffs);
deferredPromise.resolve(staffs);
})
.error(function(){
deferredPromise.reject();
console.log('Unsucessful json call');
});
return {
loadAllSettings: function () {
return deferredPromise.promise;
}
}
};
.controller("staffCtrl", function (staffServices) {
var self = this;
self.settings = [];
staffServices.loadAllSettings()
.then(function (settings) {
console.log(settings);
self.settings = [].concat(settings);
});
});
.resolve()
или .reject()
), код внутри .then()
будет выполнен. На самом деле, я считаю, что вы даже можете избавиться от переменной «обещание» внутри функции staffService и просто вызвать $ http.get напрямую
Вызов $ http.get является асинхронным, поэтому, когда вы вызываете console.log внутри обратного вызова.success, этот статус фактически не выполняется, пока не будет разрешен запрос $ http.get.
Во второй раз, когда вы вызываете console.log, вне оператора.success запрос на получение еще не разрешен, поэтому сотрудники все еще остаются той же пустой переменной, что и в начале.
Если этот ответ не имеет для вас смысла, или вы не знакомы с асинхронным материалом, могу ли я рекомендовать вам проверить этот вопрос, который хорошо объясняет асинхронные вызовы.
Что касается JSON, который не возвращается должным образом, я считаю, что $ q.when (из функции loadAllSettings()) должен возвращать обещание, когда в настоящее время он возвращает пользовательские настройки объекта JSON. Чтобы использовать вызов.then в возвращаемом заявлении, это должно быть обещание. Попробуйте настроить персонал только как ответ, а затем получить атрибут.staffSettings в контроллере.
.controller("staffCtrl", function (staffService) {
var self = this;
self.settings = [];
staffService.loadAllSettings()
.then(function (settings) {
self.settings = [].concat(settings.staffSettings);
console.log(settings);
});
});