我有一个控制器需要检索两个单独的 REST 资源,这些资源将填充两个下拉列表。我想避免填充它们中的任何一个,直到两个 $http.get() 调用都返回,以便下拉列表看起来是同时填充的,而不是一个接一个地滴入。
是否可以捆绑 $http.get() 调用并为两个返回的数组优雅地设置 $scope 变量,而不必为两种情况编写状态逻辑,例如 a 在 b 之前返回,b 在 a 之前返回?
我有一个控制器需要检索两个单独的 REST 资源,这些资源将填充两个下拉列表。我想避免填充它们中的任何一个,直到两个 $http.get() 调用都返回,以便下拉列表看起来是同时填充的,而不是一个接一个地滴入。
是否可以捆绑 $http.get() 调用并为两个返回的数组优雅地设置 $scope 变量,而不必为两种情况编写状态逻辑,例如 a 在 b 之前返回,b 在 a 之前返回?
调用 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 */
});
}
你的意思是这样的:
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
});
}
您可以在此处使用异步 javsscript 库:https ://github.com/caolan/async 。
使用系列电话。它将进行 2 次调用,然后在两者都完成后调用一次回调。