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

jQuery新手求教:多次GET请求的最佳实践及代码优化建议

jQuery 最佳实践:优化你的AJAX请求代码

作为jQuery新手,能察觉到当前实现可能存在大量重复查询的问题,已经很有洞察力啦!咱们来一步步优化这段代码,既解决性能问题,又让代码更规整好维护~

1. 先搞定重复请求的问题(请求锁)

如果这段代码是绑定在点击、输入这类高频触发的事件上,很容易短时间内发起一堆重复请求。咱们可以加个简单的请求锁,避免同时发起多个请求:

// 定义一个标记,记录当前是否有请求在进行
let isRequesting = false;

function fetchItem(id) {
  // 如果已有请求在跑,直接返回,不重复发起
  if (isRequesting) return;
  isRequesting = true;
  
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: `api/items/${id}`, // 用ES6模板字符串拼接URL,比加号更清晰
    success: function(data) {
      // 你的原有业务逻辑
      $('#item-all').empty();
      $('#builder').addClass('hidden');
      if ($('#btnsuc').length === 0) {
        $('#page').append('<div class="item-searcher" id="item-searcher"><button class="btn-success" id="btnsuc">Retour</button>...');
      }
      // 请求完成后,把标记重置,允许后续请求
      isRequesting = false;
    },
    error: function() {
      // 出错也要重置标记哦,不然以后就没法发起请求了
      isRequesting = false;
      // 这里可以加个错误提示,比如给用户弹个消息
      alert('加载数据失败,请稍后重试');
    }
  });
}

2. 减少DOM操作,降低页面重排

你现在的代码里多次直接操作DOM,比如empty()、addClass()、append(),每一次DOM操作都会触发页面重排,次数多了会让页面变卡。咱们可以把DOM操作合并,或者用文档片段来批量更新:

success: function(data) {
  // 创建一个文档片段,把要添加的元素先放在里面
  const fragment = document.createDocumentFragment();
  
  if ($('#btnsuc').length === 0) {
    // 先创建好要添加的元素
    const searcherDiv = $('<div class="item-searcher" id="item-searcher"><button class="btn-success" id="btnsuc">Retour</button>...')[0];
    fragment.appendChild(searcherDiv);
  }
  
  // 一次性完成所有DOM更新,减少重排次数
  $('#item-all').empty();
  $('#builder').addClass('hidden');
  $('#page').append(fragment);
  
  isRequesting = false;
}

3. 拆分代码,让逻辑更清晰

把数据处理、DOM更新和AJAX请求的逻辑分开,以后维护起来会轻松很多,比如:

// 专门处理数据的函数:可以在这里做数据验证、转换
function processItemData(data) {
  // 举个例子:如果数据为空,返回默认值
  return data || {};
}

// 专门更新DOM的函数:只负责把数据渲染到页面
function updateItemDOM(data) {
  $('#item-all').empty();
  $('#builder').addClass('hidden');
  
  if ($('#btnsuc').length === 0) {
    $('#page').append('<div class="item-searcher" id="item-searcher"><button class="btn-success" id="btnsuc">Retour</button>...');
  }
}

// 专门负责AJAX请求的函数
function fetchItem(id) {
  if (isRequesting) return;
  isRequesting = true;
  
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: `api/items/${id}`,
    success: function(data) {
      const processedData = processItemData(data);
      updateItemDOM(processedData);
      isRequesting = false;
    },
    error: function(xhr, status, error) {
      console.error('请求出错啦:', error);
      isRequesting = false;
    }
  });
}

4. 缓存请求结果,避免重复调用API

如果同一个id会被多次查询,咱们可以把请求结果缓存起来,下次再查同一个id的时候直接用缓存的结果,不用再发请求啦:

// 用一个对象来存缓存的结果
const itemCache = {};

function fetchItem(id) {
  // 如果缓存里已有这个id的数据,直接渲染,不用发请求
  if (itemCache[id]) {
    updateItemDOM(itemCache[id]);
    return;
  }
  
  if (isRequesting) return;
  isRequesting = true;
  
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: `api/items/${id}`,
    success: function(data) {
      // 把数据存入缓存
      itemCache[id] = data;
      const processedData = processItemData(data);
      updateItemDOM(processedData);
      isRequesting = false;
    },
    error: function(xhr, status, error) {
      console.error('请求出错啦:', error);
      isRequesting = false;
    }
  });
}

内容的提问来源于stack exchange,提问作者Zeyukan Ich'

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:22:31