JavaScript、AngularJS - 发送多个同时的 ajax 调用

标签 javascript angularjs ajax promise es6-promise

在我的 AngularJS 应用程序中,我有一个参数数组(例如一些 ID),它们应该用作 ajax 调用队列的参数。问题是数组可能包含超过 600 个项目,如果我只是使用 forEach 循环递归地进行 ajax 调用,则浏览器页面最终会在每个请求得到解析之前停止响应,因为每个响应更新 View 。是否有一种技术可以允许发送 ajax 请求,例如,一次异步发送 5 个请求,并且只有当这些请求完成后,才继续下一个 5 个请求?

最佳答案

我认为最好的解决方案是更改端点以允许 Id 数组,但我想这不是一个选项。您可以使用 Promise 来限制同时请求的数量:

function chunkedAjax(idArray, index, limit) {
  if(index >= idArray.length) {
    return;
  }
  var index = index || 0;
  var limit = limit || 5;

  var chunk = idArray.slice(index, limit);
  var promises = [];

  angular.forEach(chunk, function(id) {
    var deferred = $q.defer();
    promises.push(deferred.promise);
    makeAjaxCall(id).then(function(response){
      deferred.resolve();
    });
  });

  $q.all(promises).then(function() {
    chukedAjax(idArray, index + limit, limit);
  });

}

这是一个递归函数,因此请注意。在投入生产之前我会对其进行大量调试。

您可能还需要修改 makeAjaxCall 函数以返回 Promise(如果尚未返回),或者将 Promise 对象传递给它,以便在 ajax 调用完成时可以解析它

关于JavaScript、AngularJS - 发送多个同时的 ajax 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39574987/

相关文章:

angularjs - 如何在Angular JS中解析字符串内的HTML标签

jquery - Django 表单与 jquery

javascript - 将 'Alt' 按键添加到现有按键功能

javascript - 通过分析字符串中的日期详细信息对字符串数组进行排序

javascript - 弹出后禁用所有文本框

javascript - Angular 指令编译函数中的 tElement 是一个 jQuery 元素吗?

javascript - 努力实现 promise

javascript - 如果输入未验证,AngularJS 会阻止提交

php - 如何在 CodeIgniter 上通过 json 将数据从 Controller 传递到 View ?

javascript - 用javascript比较日期