在循环内围绕 angular 数据服务调用时换行 jquery

wrap jquery when around angular data service calls within loop

所以我有一个页面,一个动作需要多次 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 deferred 中看起来是一种合理的方法,但我一直无法让它工作,还有比尝试适应调用更好的方法吗(goGetEmBoys 函数和最终的循环)在这样的延迟中?

尝试了对作用域函数的调用,以及 jquery 中的代码块……我一定是用错了。欢迎任何建议。

我不知道我是否完全理解你想要实现的目标 - 你想知道所有请求何时完成?如果 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.areRequestFinished 上设置 $scope.$watch 以在请求完成时采取行动。你也可以玩 $q.all 但我从来没有让它为我工作,而且我认为我的解决方案很容易弄清楚,即使它需要更多代码。手表可以这样:

$scope.$watch('areRequestFinished', function (newValue, oldValue) {
    if ((newValue !== oldValue) && (newValue === true)) {
        doSomething();
    }
});