所以我有一个页面,一个动作需要多个ajax调用。调用angular dataService.getData,它使用$ q / deferred,如下所示:
return {
getData: function(obj) {
var def = $q.defer();
$http({
url: obj.url,
method: "GET",
headers: { "Content-Type": "application/json" }
}).then(function(data) {
if (data.data) {
def.resolve({
response: data
})
}
})
return def.promise;
}
}
在某一点上,我需要对来自控制器的一组项目调用几个单独的请求:
$scope.goGetEmBoys = function(group) {
config.group.forEach(function(d) {
if(d.name == group) {
dataService.getData({url: d.urlToCall})
.then(function(data){
// use each with its own registered callback
d.callback(data);
})
}
})
}
我想要做的是在请求工作和完成时切换一个bitValue,即使我必须存储类似于$ scope.somethingIsHappening = 0等的东西
我认为将它包装在$ .when延迟读取就像一个合理的方法,但我一直无法使其工作,也有一个更好的方法,而不是试图适应调用(goGetEmBoys函数,最终循环)像这样延迟了吗?
尝试调用scope函数,以及jquery里面的块当....我必须使用它错了。欢迎任何建议。
答案 0 :(得分:1)
我不知道我完全明白你想要达到什么目标 - 你想知道所有请求何时完成?如果group
的长度没有变化,您可以尝试以下方法:
$scope.areReqestsFinished = false;
$scope.goGetEmBoys = function(group) {
var counter = 0;
config.group.forEach(function(d) {
if(d.name == group) {
dataService.getData({url: d.urlToCall})
.then(function(data){
// use each with its own registered callback
d.callback(data);
counter++;
if (counter === config.group.length) {
$scope.areRequestFinished = true;
}
})
}
})
}
您可以在$scope.$watch
上设置$scope.areRequestFinished
以在请求完成时执行操作。你也可以玩$q.all
,但我从来没有让它适合我,我认为我的解决方案很容易解决,即使它需要更多的代码。手表可以是这样的:
$scope.$watch('areRequestFinished', function (newValue, oldValue) {
if ((newValue !== oldValue) && (newValue === true)) {
doSomething();
}
});