在循环中的角度数据服务调用周围时包装jquery

时间:2017-04-27 15:12:09

标签: jquery angularjs ajax deferred

所以我有一个页面,一个动作需要多个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里面的块当....我必须使用它错了。欢迎任何建议。

1 个答案:

答案 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();
    }
});