Существует контроллер, который говорит, что страны и их города используют службу, которая использует $http.get()
для извлечения данных с сервера. Как страны, так и города являются массивами json.Цепочки вложенных обещаний в цикле
Текущая реализация
сервис
service.getCountries = function() {
return $http.get('url');
}
service.getCities = function(country) {
return $http.get('url' + country);
}
контроллер
var getCountries = function() {
service.getCountries()
.success(function (countries) {
angular.forEach(countries, function (country) {
// process country
getCities(country);
});
})
.error(function() {
alert('failed to load countries');
});
};
var getCities = function (country) {
service.getCities(country)
.success(function (cities) {
angular.forEach(cities, function (city) {
// process city
});
})
.error(function() {
alert('failed to load cities of ' + country);
});
};
var doAfterCountriesAndCitiesLoaded = function() {
// do
}
getCountries();
doAfterCountriesAndCitiesLoaded();
Я хочу, чтобы приковать выборку стран и городов, так что doAfterCountriesAndCitiesLoaded()
обрабатывается в качестве последней цепи.
Как этот код может быть преобразован в целую цепочку с правильной обработкой ошибок?
Зачем нужно «бросать новую ошибку (сообщение)»? –
Это необходимо для того, чтобы 'getCountries' знал, что одна из операций getCities не удалась. В этом отношении я бы сказал, что имеет смысл выбросить ошибку в 'catch' функции' getCountries'. – JLRishe
Ну, еще немного вопросов: 1) улов используется для обработки defer.reject() afaik. Может ли уловка также обрабатывать «throw new Error()» тоже? 2) Есть ли преимущество использования q в этом случае/catch над успехом/ошибкой http в вышеприведенном коде? –