当前位置: 首页 > news >正文

ajax回调钩子的应用简介

$.ajax() 是 jQuery 中最核心的 AJAX 方法,它提供了丰富的 回调钩子(Callback Options),让你可以在请求的不同阶段插入自定义逻辑。

下面是对 beforeSendsuccess 等常用参数的全面、详细、带示例的介绍

✅ $.ajax() 常用回调参数详解

参数名触发时机是否异步典型用途
beforeSend请求发送前同步设置请求头、取消请求
success请求成功(HTTP 2xx)异步处理返回数据、更新页面
error请求失败(网络错误、4xx/5xx)异步错误提示、重试机制
complete请求完成(无论成功或失败)异步隐藏加载动画、清理资源
statusCode按 HTTP 状态码定制处理异步特定状态码处理(如 401 跳登录)

1️⃣ beforeSend(xhr, settings)

触发时机
  • 在请求发送之前立即调用
  • 是最后一个可以修改请求的机会
  • 执行是同步的(会阻塞请求发送)
参数
参数类型说明
xhrXMLHttpRequest原生请求对象,可用于设置请求头
settingsObject当前请求的配置项(包含 urltypedata 等)
典型用途
  • 设置认证头(如 Authorization
  • 添加 CSRF Token
  • 条件性取消请求
  • 显示加载动画(开始)
✅ 示例代码
$.ajax({url: '/api/data',type: 'POST',data: { name: '张三' },beforeSend: function(xhr, settings) {// 1. 添加 CSRF Token(Django 项目常见)var token = getCookie('csrftoken');if (token) {xhr.setRequestHeader('X-CSRFToken', token);}// 2. 添加 JWT 认证头var jwt = localStorage.getItem('token');if (jwt) {xhr.setRequestHeader('Authorization', 'Bearer ' + jwt);}// 3. 条件性取消请求if (settings.type === 'DELETE' && !confirm('确定要删除吗?')) {return false; // 返回 false 可取消请求}// 4. 显示加载动画$('#loading').show();},success: function(data) {console.log('成功:', data);}
});

⚠️ 注意:beforeSendreturn false取消请求


2️⃣ success(data, textStatus, xhr)

触发时机
  • 请求成功且服务器返回有效响应时调用
  • HTTP 状态码为 2xx(如 200, 201)
  • 执行是异步的
参数
参数类型说明
dataObject/String解析后的响应数据(自动根据 dataType 解析)
textStatusString状态描述,通常是 "success"
xhrXMLHttpRequest原生请求对象,可读取响应头等
典型用途
  • 更新页面内容(DOM 操作)
  • 处理 JSON 数据
  • 跳转页面
  • 隐藏加载动画
✅ 示例代码
$.ajax({url: '/api/user',type: 'GET',dataType: 'json', // 告诉 jQuery 期望返回 JSONsuccess: function(data, textStatus, xhr) {// data 已自动解析为 JavaScript 对象console.log('用户数据:', data);console.log('状态:', textStatus); // "success"console.log('响应头 ETag:', xhr.getResponseHeader('ETag'));// 更新页面$('#username').text(data.name);$('#email').text(data.email);// 跳转if (data.isAdmin) {window.location.href = '/admin';}}
});

如果 dataType'json',jQuery 会自动 JSON.parse(),你拿到的就是 JS 对象。


3️⃣ error(xhr, textStatus, errorThrown)

触发时机
  • 请求失败时调用
  • 包括:
    • 网络错误(无法连接)
    • HTTP 错误(404, 500, 403 等)
    • 超时
    • JSON 解析失败
参数
参数类型说明
xhrXMLHttpRequest可读取 statusstatusText、响应体
textStatusString错误类型:"timeout""error""abort""parsererror"
errorThrownStringHTTP 状态文本(如 "Not Found"),仅当有 HTTP 错误时
典型用途
  • 显示错误提示
  • 日志记录
  • 重试机制
  • 处理特定错误(如 401 跳登录)
✅ 示例代码
$.ajax({url: '/api/data',type: 'GET',error: function(xhr, textStatus, errorThrown) {console.error('AJAX 错误:', textStatus, errorThrown);let message = '';if (textStatus === 'timeout') {message = '请求超时,请检查网络';} else if (xhr.status === 404) {message = '请求的资源不存在';} else if (xhr.status === 401) {message = '未登录,即将跳转...';setTimeout(() => {window.location.href = '/login';}, 1000);} else if (xhr.status === 500) {message = '服务器内部错误';} else {message = '请求失败:' + errorThrown;}alert(message);}
});

常见 textStatus

  • "timeout":超时
  • "error":一般网络或服务器错误
  • "abort":请求被取消(如页面跳转)
  • "parsererror":JSON/XML 解析失败

4️⃣ complete(xhr, textStatus)

触发时机
  • 请求完成后调用,无论成功或失败
  • 是“收尾工作”的理想位置
  • 总是执行一次
参数
参数类型说明
xhrXMLHttpRequest请求对象
textStatusString最终状态:"success""notmodified""error""timeout""abort"
典型用途
  • 隐藏加载动画
  • 清理资源
  • 统一日志记录
✅ 示例代码
$.ajax({url: '/api/upload',type: 'POST',beforeSend: function() {$('#loading').show(); // 显示加载},success: function(data) {alert('上传成功!');},error: function() {alert('上传失败!');},complete: function(xhr, textStatus) {// 无论成功失败都隐藏加载动画$('#loading').hide();// 统一日志console.log('请求结束,状态:', textStatus);console.log('最终状态码:', xhr.status);}
});

✅ 这是最佳实践beforeSend 显示加载,complete 隐藏加载。


5️⃣ statusCode(高级用法)

作用
  • 按 HTTP 状态码 定制处理函数
  • 可以与 error 并存,更精细控制
✅ 示例代码
$.ajax({url: '/api/data',type: 'GET',statusCode: {404: function() {alert('页面找不到了');},403: function() {alert('权限不足');},401: function() {alert('请先登录');window.location.href = '/login';},500: function() {alert('服务器开小差了,请稍后再试');},200: function(data) {// 也可以为 200 写处理(但通常用 success 更好)console.log('正常返回:', data);}},error: function(xhr, status) {// 如果 statusCode 中没有匹配的状态码,才会走 erroralert('未知错误:', status);}
});

优先级:statusCode > error


完整示例:综合使用所有回调

$.ajax({url: '/api/profile',type: 'PUT',data: { name: '李四', age: 25 },beforeSend: function(xhr) {// 设置认证xhr.setRequestHeader('Authorization', 'Bearer ' + getToken());// 显示加载$('#spinner').show();},success: function(data) {alert('保存成功!');$('#profile-form').addClass('saved');},error: function(xhr, status, err) {if (status !== 'abort') { // 排除手动取消alert('保存失败: ' + err);}},complete: function() {// 隐藏加载$('#spinner').hide();},statusCode: {401: function() {window.location.href = '/login';}}
});

总结表格

回调触发条件是否可取消请求常见用途
beforeSend发送前✅ 可通过 return false 取消设置头、验证、显示加载
success成功(2xx)❌ 不可取消更新 UI、处理数据
error失败(网络/4xx/5xx)❌ 不可取消错误提示、日志
complete结束(成功或失败)❌ 不可取消隐藏加载、清理
statusCode按状态码❌ 不可取消精细化错误处理

一句话终极解释

$.ajax 的回调就像一场舞台剧的流程控制

  • beforeSend → 开幕前准备道具(设置头)
  • success → 演出成功,观众鼓掌(更新页面)
  • error → 演出失败,主持人救场(报错提示)
  • complete → 谢幕,收拾舞台(隐藏加载)
  • statusCode → 按剧本分支处理不同结局
http://www.jsqmd.com/news/22539/

相关文章:

  • PS-02
  • 详细介绍:[特殊字符]️ Spring Cloud Eureka 三步通:搭建注册中心 + 服务注册 + 服务发现,通俗易懂!
  • 2025年10月中国办公家具定制公司推荐:口碑排行榜与权威解析
  • 2025年10月中国办公家具定制公司推荐:主流口碑排行榜与避坑指南
  • 2020 级课前测试试卷-电子商务大数据分析 爬取京东商品评论数据,基于hadoop实现数据分析以及数据可视化
  • 2025年10月暖风机评测指南:客观数据助您精准避坑
  • 芯片落地之道
  • 关于克服 libwebsockets 库编译时遇到的困难的实用的方法:
  • 2025年10月暖风机口碑榜:主流机型对比与选购避坑指南
  • 《React vs Vue:选择适合你的前端框架》 - 指南
  • 2025 年 10 月展示柜厂家最新推荐,技术实力与市场口碑深度解析
  • 107.计组--四章
  • LazyLLM学习:使用提示词工程+RAG创建AI女友
  • 2025 年 10 月铝合金切削液厂家最新推荐,高性能与可靠性兼具的优质品牌
  • 详细介绍:K8s StorageClass配置实战:从入门到精通
  • 2025 年 10 月硬质合金切削液厂家最新推荐,精准检测与稳定性能深度解析
  • 2025 年 10 月钛合金切削液厂家最新推荐,聚焦高端定制需求与全案交付能力
  • 2025 年 10 月铜材切削液厂家最新推荐,精准检测与稳定性能深度解析
  • 实用指南:proxy_pass和location匹配路径的拼接逻辑
  • 【System Beats!】第四章 处理器体系结构
  • 申威 SW-64 架构安装 MySQL 8.0.18 (KY10系统 RPM包) 步骤指南
  • java learning
  • 【11】C实战篇——C语言 【scanf、printf、fprintf、fscanf、sprintf、sscanf】的区别 - 详解
  • 读AI赋能10助手
  • P13518 [KOI 2025 #2] 镜子
  • Correlation inequality小记
  • 实用指南:TimescaleDB 超表 物理表解释
  • 使用Prodfiler优化eBPF编译器性能:从内存分配到向量化的全面调优
  • 详细介绍:JMeter接口测试
  • 深入解析:GESP25年9月编程题解析