Angular - 多个$ http.get数据请求

时间:2015-10-29 20:27:01

标签: javascript angularjs

在为同一视图中所需的数据进行多次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请求。

虽然这有效,但我觉得可能有更优雅的解决方案。

一如既往的任何想法都非常感激。

3 个答案:

答案 0 :(得分:2)

您可以使用q.all(),因为它接受一系列承诺,只有在所有承诺都已解决后才能解决。

$q.all([
      $service.getDataOne(),
      $service.getDataTwo()
    ]).then(function(data){
      $scope.dataOne = data[0];
      $scope.dataTwo = data[1];
 });
  

如果您查看该链接,q.All()位于页面的最底部

答案 1 :(得分:1)

我相信您正在寻找$ 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';
});
}

信用:从未知的小提琴创作者无耻地窃取代码。

答案 2 :(得分:0)

如果要为所有下拉列表加载looku pdata,我会进行一次调用,以便在一个有效负载中获取所有查找数据。像这样的东西。每个属性值都是每个下拉列表的项目数组。

{
    "eventMethods": [
        {
            "name": "In Person",
            "id": 1
        },
        {
            "name": "Phone",
            "id": 2
        }
    ],
    "statuses": [
        {
            "name": "Cancelled",
            "id": 42
        },
        {
            "name": "Complete",
            "id": 41
        }
    ]
}