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

bru*_*eaf 18 javascript angularjs

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

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

Kev*_*son 36

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

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

将多个promise组合成一个promise,在解析所有输入promise时解析.

参数

  • 承诺 - {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 */
  });
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是"链条",而是"捆绑" (5认同)

Sud*_*oti 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
    });
}
Run Code Online (Sandbox Code Playgroud)

参考:Angular JS Doc