Каков наилучший подход при выполнении нескольких вызовов API для данных, необходимых в одном представлении?
Например, у вас есть несколько полей выбора, которые должны содержать данные, вытащенные извне приложения, все в одном представлении.
Есть ли более элегантное решение, чем просто увольнение их сразу в вашем контроллере? Например, следующие
app.controller('myCtrl', function($service) {
$service.getDataOne().then(function(response) {
$scope.dataOne = response;
}, function(error) {
console.log(error);
});
$service.getDataTwo().then(function(response) {
$scope.dataTwo = response;
}, function(error) {
console.log(error);
})
});
и т.д.... с каждой служебной функцией, выполняющей запрос $ http.get.
Хотя это работает, я чувствую, что есть, вероятно, более элегантное решение.
Любые мысли, как всегда, очень ценятся.
Вы можете использовать q.all(), поскольку он принимает массив обещаний, который будет разрешен только тогда, когда все обещания будут разрешены.
$q.all([
$service.getDataOne(),
$service.getDataTwo()
]).then(function(data){
$scope.dataOne = data[0];
$scope.dataTwo = data[1];
});
Если вы посмотрите на ссылку,
q.All()
находится в самом низу страницы
Я считаю, что вы ищете услугу $ q.
http://jsfiddle.net/Zenuka/pHEf9/21/
https://docs.angularjs.org/api/ng/service/ $ q
function TodoCtrl($scope, $q, $timeout) {
function createPromise(name, timeout, willSucceed) {
$scope[name] = 'Running';
var deferred = $q.defer();
$timeout(function() {
if (willSucceed) {
$scope[name] = 'Completed';
deferred.resolve(name);
} else {
$scope[name] = 'Failed';
deferred.reject(name);
}
}, timeout * 1000);
return deferred.promise;
}
// Create 5 promises
var promises = [];
var names = [];
for (var i = 1; i <= 5; i++) {
var willSucceed = true;
if (i == 2) willSucceed = false;
promises.push(createPromise('Promise' + i, i, willSucceed));
}
// Wait for all promises
$scope.Status1 = 'Waiting';
$scope.Status2 = 'Waiting';
$q.all(promises).then(
function() {
$scope.Status1 = 'Done';
},
function() {
$scope.Status1 = 'Failed';
}
).finally(function() {
$scope.Status2 = 'Done waiting';
});
}
Кредит: Код бесстыдно украден у неизвестного создателя скрипки.
Если он загружает looku pdata для всех выпадающих списков, я бы сделал один звонок, чтобы получить все данные поиска в одной полезной нагрузке. Что-то вроде этого. Каждое значение свойства представляет собой массив элементов для каждого раскрывающегося списка.
{
"eventMethods": [
{
"name": "In Person",
"id": 1
},
{
"name": "Phone",
"id": 2
}
],
"statuses": [
{
"name": "Cancelled",
"id": 42
},
{
"name": "Complete",
"id": 41
}
]
}