10

我有两个 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 个请求),一旦这些调用完成,就转到下一个批处理,依此类推。

4

3 回答 3

7

你总是可以使用像这个angular-http-batcher这样的适当的 HTTP 批处理模块- 它会在将所有请求发送到服务器之前将它们转换为单个 HTTP POST 请求。因此,它将 250 个调用减少到 1 个!该模块在这里https://github.com/jonsamwell/angular-http-batcher和它的详细解释在这里http://jonsamwell.com/batching-http-requests-in-angular/

于 2014-08-23T10:05:54.953 回答
3

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

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)
  });
}
于 2013-11-15T04:01:39.920 回答
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 具有“限制”同时请求数量并因此“限制”批处理的强大功能。

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 还有很多其他令人惊叹的选项,您可以串联、并行、映射数组等运行。值得注意的是,您可以通过使用单个函数和 async 的“eachLimit”函数来实现更高的效率.

于 2013-11-13T15:29:36.680 回答