18

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

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

4

3 回答 3

36

调用 Angular $http函数的返回值是一个Promise使用$q的对象(受Kris Kowal 的 Q启发的 promise/deferred 实现)。

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

将多个 Promise 组合成一个 Promise,当所有输入 Promise 都解决时,该 Promise 将被解决。

参数

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

退货

{Promise}– 返回一个单独的 Promise,该 Promise 将使用一个值数组解析,每个值对应于 Promise 数组中相同索引处的 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 */
  });
}
于 2013-03-31T05:11:22.800 回答
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 文档

于 2013-03-31T04:53:51.863 回答
0

您可以在此处使用异步 javsscript 库:https ://github.com/caolan/async 。

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

于 2013-08-08T14:36:29.113 回答