我陷入了一些我认为应该直截了当的事情。我需要从三个不同的ajax调用中获取数据,组合并处理所有三个,并将结果数组显示给用户。
最简单的形式是我的代码:
function giftControler ($scope, $http) {
var names = $http.get("names.json"),
naughty = $http.get("naughty.json"),
nice = $http.get("nice.json");
我知道我的变量被分配给promises,而不是实际结果,并且http请求已经传递给事件队列。如果我用可执行语句跟随这些变量,这些变量将是未定义的。我不明白如何等待这些承诺来解决,以便继续处理它们。
我想做的是立即添加代码:
for (var i=0; i<names.length; i++){
for (var j=0; j<nice.length; j++){
if (names[i] === nice[j]){
names[i] = names[i] + "--Yay!!";
};
};
};
$scope.kids = names;
问题在于,我不能像承诺一样解决数组问题。在http调用之后,Javascript会立即看到这些语句,并尝试立即执行它们,即使承诺尚未解决。
我遇到的问题是$http api给了我一个包含三个函数的promise对象:error
,success
&amp; then
。在这种情况下,我不知道该如何处理。我需要为这三个人提供一个成功的功能。我需要全部三个来解决,然后处理每个中的数据,然后将结果分配给角度模型。
我确信我遗漏了一些明显的东西,但有人有建议吗?在我的实际工作中,我有几个ajax调用多个数据源和大量处理(比较值,排序,连接等)来提出一个好的数据集合,但我无法通过这个问题。
谢谢,
答案 0 :(得分:157)
你可以使用$ q的函数'all':
function giftControler ($scope, $http, $q) {
var names = $http.get("names.json"),
naughty = $http.get("naughty.json"),
nice = $http.get("nice.json");
$q.all([names, naughty,nice]).then(function(arrayOfResults) {
... This callback would be called when all promised would be resolved
});
这种方式有点清洁。
以下是docementation的链接:http://docs.angularjs.org/api/ng.$q