Может ли кто-нибудь объяснить мне, что делает этот код? Я знаю, что он выбирает страны и подталкивает их к списку, который показан на веб-странице, но почему? Я думаю, что $ scope.countries = service.query() достаточно или это способ избежать асинхронных проблем?
$q.all([$scope.address.$promise, $scope.countrys.$promise]).then(function() {
if (!$scope.address.country.id) {
return $q.reject();
}
return Country.get({id : $scope.address.country.id}).$promise;
}).then(function(country) {
$scope.countrys.push(country);
});
Описания в комментариях кода. Это условно процесс загрузки данных с использованием механизма обещаний. Попробуйте указать свой вопрос более подробно, если вам недостаточно
// if address and countries was loaded (probably from ajax request)
$q.all([$scope.address.$promise, $scope.countrys.$promise]).then(function() {
// if address doesn't exist reject all actions
if (!$scope.address.country.id) {
return $q.reject();
}
// otherwise load country based on address field as a promise
return Country.get({id : $scope.address.country.id}).$promise;
}).then(function(country) {
// when loading process is finished add country to dataset
$scope.countrys.push(country);
});
Согласно сервисной документации на $q
$q.all([promise1, promise2,...])
Объединяет несколько обещаний в единое обещание, которое разрешается, когда все вступительные обещания разрешаются.
service.query()
неизбежно вернет обещание, которое будет устранено после завершения асинхронного вызова. Не имеет смысла устанавливать свойство scope (которое вы, без сомнения, связываете с каким-то списком) с обещанием.
То, что делает код, - это ожидание того, что обещание разрешило, выполнило некоторую логику и установило полученные данные в свойство scope.
$scope.address
и$scope.countrys
были правильно загружены до начала этой обработки. Смотри мое редактирование