You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按顺序依次调用AJAX以避免服务器过载?

实现AJAX串行逐个请求的解决方案

你完全可以实现AJAX请求的串行执行,避免同时发起大量请求导致服务器过载,下面提供两种实用方案:

方案一:递归函数实现

先将后端的$data数组转换为前端可访问的JS数组,再通过递归函数逐个发起请求:

<script>
// 把后端数据转为前端数组
const urlList = @json($data);
const apiUrl = "/get-data-test-res";

// 递归处理请求
function processRequest(index) {
  // 所有请求处理完成则终止
  if (index >= urlList.length) return;

  $.ajax({
    url: apiUrl,
    data: { url: urlList[index] },
    type: "get"
  }).done(function(res) {
    // 更新对应DOM内容
    $(`.${index}`).html(res.title);
    // 处理下一个请求
    processRequest(index + 1);
  }).fail(function() {
    // 请求失败时的处理,这里选择继续下一个请求,可按需调整
    console.error(`第${index+1}个请求失败`);
    processRequest(index + 1);
  });
}

// 启动第一个请求
processRequest(0);
</script>

原理:递归函数每次仅处理一个请求,当前请求完成(成功或失败)后,再调用自身处理下一个请求,确保同一时间只有一个AJAX请求在运行。

方案二:Promise链式调用(现代JS写法)

利用jQuery的$.ajax返回Promise对象的特性,通过reduce构建串行请求链:

<script>
const urlList = @json($data);
const apiUrl = "/get-data-test-res";

// 构建串行Promise链
urlList.reduce((chain, url, index) => {
  return chain.then(() => {
    return $.ajax({
      url: apiUrl,
      data: { url: url },
      type: "get"
    }).done(function(res) {
      $(`.${index}`).html(res.title);
    }).fail(function() {
      console.error(`第${index+1}个请求失败`);
    });
  });
}, Promise.resolve()); // 初始Promise,立即进入链式执行
</script>

原理:reduce从一个已完成的Promise开始,每个后续请求都等待前一个请求完成后才发起,实现严格的串行执行。

为什么之前的循环会导致过载?

你之前的循环会在页面加载时立即发起所有AJAX请求,浏览器会同时建立多个HTTP连接,服务器瞬间收到大量请求,超出处理能力导致过载;而串行请求是逐个处理,服务器压力会大幅降低。

内容的提问来源于stack exchange,提问作者sawyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:15:13