javascript - AJAX - 如何在不卡住浏览器的情况下一个一个地发出异步请求?

标签 javascript jquery ajax asynchronous

我有一个像下面这样的文本区域:

<textarea name="mailist" id="mailist" placeholder="email@domain.com"></textarea>

我想从邮件列表发出请求,并使用 "split"和 "foreach"将数据(每行电子邮件)发送到某个 URL。它成功了。

但问题是,当我点击提交按钮时,所有请求同时发送。我怎样才能做到:

  • 对方结束后发送请求

  • 异步发起请求

  • 不卡住浏览器

最佳答案

您正在寻找的是promise。 jQuery 中的每个 $.ajax 函数都会返回一个 promise。您可以阅读 documentation here获取更多详细信息。要点是,返回的 promise 公开了一个名为 then 的函数,该函数可用于以您希望的方式一个接一个地链接请求。

考虑这种 ajax 请求

var request = $.ajax({
  method: 'get',
  url: 'www.google.com'
});

因为它是异步运行的,所以你需要注册处理程序来让你知道请求何时成功完成,或者失败,就像这样

request.then(
    function successHandler(response) {
        /* The first function will be called if the request is successful */
    },
    function failureHandler(response) {
       /* The second function will be called if the request fails */
    }
);

使用此模式,您可以等待请求成功或失败,然后再继续下一个请求。

完整保留前面的代码部分

您需要实现一个排序队列。大多数浏览器都有大约 2-5 个并发请求的合理限制。一个例子是

var emailAddresses = [/* a list email addresses */];
var MAX_SIMULTANEOUS_REQUESTS = 4;
var CURRENT_REQUESTS = [];

function runRequests(emailAddresses, max, running) {
  while(running.length < max) {
    running.push(createRequest(emailAddress.pop(), running));
  }
  return emailAddresses.length;
}

function createRequest(emailAddress, running) {
  var request = /* Creates requests in some manner */;
  request
    .then(
      function() {
        /* Remove this request from the list of running requests */
        var indexOfRequest = running.indexOf(request);
        running.splice(indexOfRequest, 1);
      },
      function() {
        /* For extra points, add this to a retry queue */
      }
    );
  
  return request;
}

/* Usage */
var interval = setInterval(function() {
  var remaining = runRequests(emailAddresses, MAX_SIMULTANEOUS_REQUESTS, CURRENT_REQUESTS);
  if (remaining === 0) {
    clearInterval(interval);
  }
}, 500);

关于javascript - AJAX - 如何在不卡住浏览器的情况下一个一个地发出异步请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36332123/

相关文章:

javascript - 如何获取作为变量获取的 <tr> 内容的填充左值

javascript - ajax成功后前置

javascript - 带有 json 数据并选择的 MVC 下拉列表

javascript - 检查脚本是否有ajax调用?

javascript - 我如何调用对象中的函数

javascript - 在 PHP 循环内提交表单时用 jQuery 替换 div 内容

javascript - IE8 中 getElementsByClassName 的原型(prototype)/jQuery 冲突

javascript - 删除 JavaScript 中的不间断空格

javascript - window.open 触发 print onLoad 时父窗口卡住

javascript - 如何使用 MongoDB/Meteor 处理 "relations"