以批量形式调用angularjs中的HTTP请求?

时间:2013-11-13 10:57:16

标签: ajax http angularjs

我有两个for循环和一个HTTP调用。

for(i=0;i<m;i++) {
  for(j=0;j<n;j++) {
    $http call that uses i and j as GET parameters
    .success(//something)
    .error(//something more)
  }
}

这个问题是它根据m和n的值进行大约200-250次AJAX调用。当尝试从移动设备访问时,这会导致浏览器崩溃问题。 我想知道是否有办法以批量形式调用HTTP请求(一次n个请求),一旦这些调用完成,移到下一批等等。

3 个答案:

答案 0 :(得分:7)

您总是可以使用正确的HTTP批处理模块,例如angular-http-batcher - 它将获取所有请求并将它们转换为单个HTTP POST请求,然后再将其发送到服务器。因此它将250个呼叫减少为1个!该模块位于https://github.com/jonsamwell/angular-http-batcher,其详细说明在http://jonsamwell.com/batching-http-requests-in-angular/

答案 1 :(得分:3)

是的,请使用此处的异步库:https://github.com/caolan/async

首先,使用循环创建任务:

var tasks = []; //array to hold the tasks
for(i=0;i<m;i++) {
  for(j=0;j<n;j++) {
    //we add a function to the array of "tasks" 
    //Async will pass that function a standard callback(error, data)
    tasks.push(function(cb){
       //because of the way closures work, you may not be able to rely on i and j here
       //if i/j don't work here, create another closure and store them as params
       $http call that uses i and j as GET parameters
       .success(function(data){cb(null, data);})
       .error(function(err){cb(err);});
    });
  }
}

现在您已经拥有一个可以执行的回调就绪函数的数组,您必须使用异步来执行它们,async有一个很好的功能来“限制”同时请求的数量,因此“批处理”。

async.parallelLimit(tasks, 10, function(error, results){
    //results is an array with each tasks results.
    //Don't forget to use $scope.$apply or $timeout to trigger a digest
});

在上面的示例中,您将一次并行运行10个任务。

Async还有很多其他令人惊叹的选择,你可以运行系列,parlallel,地图数组等等。值得注意的是,你可以通过使用单个函数和“eachLimit”来提高效率。异步的功能。

答案 2 :(得分:3)

我这样做的方式如下(当一个人想要批量调用n requests at a time中的HTTP请求时,这将有所帮助)

call batchedHTTP(with i=0);

batchedHTTP = function() {
  /* check for terminating condition (in this case, i=m) */
  for(j=0;j<n;j++) {
    var promise = $http call with i and j GET parameters
    .success(// do something)
    .error(// do something else)

    promisesArray.push(promise);
  }
  $q.all(promisesArray).then(function() {
    call batchedHTTP(with i=i+1)
  });
}