2013-03-31 27 views
17

我有一个控制器,需要检索两个单独的REST资源,将填充两个下拉菜单。我希望避免在两个$ http.get()调用都返回之前填充它们中的任何一个,以便下拉似乎同时被填充,而不是一个接一个地涓涓细流。

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

+1

仅供参考 - 问题标题说“链”,但身体描述了一个连接。不确定在这里编辑是否合适。 –

回答

36

调用角$http函数的返回值是使用$qPromise对象(一个承诺/延期执行由Kris Kowal's Q启发) 。

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

将多个承诺变成一个承诺,当 所有输入承诺的决心,得到解决。

参数

  • 承诺 - {Array.<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 */ 
    }); 
} 
+0

错误()会发生什么?这将在结果数组中可用吗? – brushleaf

+0

请参阅有关任何拒绝的文档说明,结果是拒绝 –

+5

如果您想要处理错误,那么在成功回调之后再添加第二个函数,然后再调用这不是“链”,而是“捆绑” – percebus

5

你的意思是这样的:

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