如何捆绑Angular $ http.get()调用?

时间:2013-03-31 04:34:01

标签: javascript angularjs

我有一个控制器需要检索两个单独的REST资源,这些资源将填充两个下拉列表。我想避免填充其中任何一个,直到两个$ http.get()调用都返回,这样下拉列表似乎同时填充,而不是一个接一个地插入。

是否可以捆绑$ http.get()调用并优雅地为两个返回的数组设置$ scope变量,而不必为两种情况编写状态逻辑,例如: a在b之前返回,b在a之前返回

3 个答案:

答案 0 :(得分:36)

使用$http(受$q启发的承诺/延迟实现)调用Angular Kris Kowal's Q函数的返回值是Promise对象。

查看$q.all(promises)方法文档:

  

将多个承诺合并到一个在何时解决的承诺中   所有的输入承诺都得到了解决。

     

<强>参数

     
      
  • promises - {Array.<Promise>} - 一系列承诺。
  •   
     

<强>返回

     

{Promise} - 返回将使用值数组解析的单个promise,每个值对应于promises数组中相同索引处的promise。如果promises中的任何一个因拒绝而得到解决,那么此结果承诺将以相同的拒绝解决。

您可以使用$q.all“加入”您的http通话结果,代码类似于:

app.controller("AppCtrl", function ($scope, $http, $q) {

  $q.all([
    $http.get('/someUrl1'),
    $http.get('/someUrl2')
  ]).then(function(results) {
     /* your logic here */
  });
}

答案 1 :(得分:6)

你是说这样的意思吗?

function someController( $scope, $http, $q ) {
    var first_meth = $http.get("first_url"),
        second_meth = $http.get("second_url");
    $q.all([first_meth, second_meth]).then(function(all_your_results_array) { 
        //here you'll get results for both the calls
    });
}

参考:Angular JS Doc

答案 2 :(得分:0)

您可以在此处使用Async javascript库:https://github.com/caolan/async

使用系列调用。它将进行2次调用,然后在完成两次调用时调用一次回调。