Недавно я много кодил в AngularJS. Через некоторое время он начал чувствовать себя комфортно с ним, а также стал действительно продуктивным. Но, к сожалению, я не понимаю одного:
В моем проекте мне нужно получать данные через $http.get и сервер RESTful API. Вот тут я начал спотыкаться в первую очередь. После реализации обещания ($q.defer и т. д. и .then) в функциях, которые обрабатывают данные, необходимые для продолжения, я подумал, что решил проблему.
Но в этом коде:
$scope.getObservationsByLocations = function() {
var promise = $q.defer();
var locationCount = 0;
angular.forEach($scope.analysisData, function(loc) { // for each location
$http.get($scope.api + 'Device?_format=json', { // get all devices
params: {
location: loc.location.id
}
}).then(function (resultDevices) {
var data = angular.fromJson(resultDevices);
promise.resolve(data);
// for each device in this location
angular.forEach(angular.fromJson(resultDevices).data.entry.map(function (dev) {
http.get($scope.api + 'Observation?_format=json', { // get all observations
params: {
device: dev.resource.id
}
}).then(function (resultObservations) {
var observations = angular.fromJson(resultObservations);
// for each obervation of that device in this location
angular.forEach(observations.data.entry.map(function(obs) {
$scope.analysisData[locationCount].observations.push({observation: obs.resource});
}));
})
}))
});
locationCount++
});
return promise.promise
};
Я не могу понять, в каком порядке выполняются команды. Поскольку я использую IDE Webstorm и его функцию отладки, было бы точнее сказать, что я не знаю, почему команды выполняются в непонятном мне порядке.
Проще говоря, все, что включено в forEach, должно быть выполнено до достижения возврата, потому что $http.get подключены через .then. Но следуя отладочной информации, функция перебирает locationCount++ и даже возвращает промис до того, как углубится (имеется в виду после первого .then() ).
Что это такое? Я неправильно понял эту часть концепции AngularJS?
Или это просто очень плохая практика, и я должен найти другое решение?
Если контекст важен/интересен: объекты основаны на, например, https://www.hl7.org/fhir/2015May/location.html#5.15.3