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

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

我想向 postman 发出请求,然后使用“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);

    10-06 12:41
    查看更多