【HTML5】【AJAX的几种封装方法详解】
【HTML5】【AJAX的几种封装方法详解】
AJAX (Asynchronous JavaScript and XML) 封装是为了简化重复的异步请求代码,提高开发效率和代码复用性。下面我将介绍几种常见的 AJAX 封装方式。
方法1. 基于原生 XMLHttpRequest 的封装
XMLHttpRequest。其主要特点如下:
- 实现动态不刷新,通过异步⽅式,提升⽤户体验,优化了浏览器和服务器之间的传输。
- 把⼀部分原本由服务器负担的⼯作转移到客户端,利⽤客户端闲置的资源进⾏处理,减轻服务器和带宽的负担,节约空间和成本。
- ⽆刷新更新⻚⾯,⽤户不⽤再像以前⼀样在服务器处理数据时,只能在死板的⽩屏前焦急的等待。AJAX使⽤XMLHttpRequest对象发送请求并得到服务器响应,在不需要重新载⼊整个⻚⾯的情况下,就可以通过DOM及时将更新的内容显示在⻚⾯上。
/*** 基于原生XHR的AJAX封装* @param {Object} options 配置对象* @param {string} options.url 请求地址* @param {string} [options.method='GET'] 请求方法* @param {Object} [options.data=null] 请求数据* @param {Object} [options.headers={}] 请求头* @param {function} [options.success] 成功回调* @param {function} [options.error] 失败回调*/
function ajax(options) {const xhr = new XMLHttpRequest();const method = options.method || 'GET';let url = options.url;let data = options.data || null;// 处理GET请求的查询参数if (method === 'GET' && data) {const params = new URLSearchParams();for (const key in data) {params.append(key, data[key]);}url += '?' + params.toString();data = null;}xhr.open(method, url, true);// 设置请求头if (options.headers) {for (const key in options.headers) {xhr.setRequestHeader(key, options.headers[key]);}}xhr.onreadystatechange = function() {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {let response = xhr.responseText;try {response = JSON.parse(response);} catch (e) {}options.success && options.success(response);} else {options.error && options.error(xhr.status, xhr.statusText);}}};xhr.onerror = function() {options.error && options.error(-1, 'Network Error');};// 发送请求if (data && typeof data === 'object') {xhr.setRequestHeader('Content-Type', 'application/json');xhr.send(JSON.stringify(data));} else {xhr.send(data);}
}// 使用示例
ajax({url: '/api/user',method: 'POST',data: { name: 'John', age: 30 },headers: {'Authorization': 'Bearer token123'},success: function(response) {console.log('Success:', response);},error: function(status, statusText) {console.error('Error:', status, statusText);}
});
方法2. 基于 Fetch API 的封装
/*** 基于Fetch API的AJAX封装* @param {string} url 请求地址* @param {Object} [options={}] 请求配置* @returns {Promise} 返回Promise对象*/
function fetchAjax(url, options = {}) {const defaultOptions = {method: 'GET',headers: {'Content-Type': 'application/json'},credentials: 'same-origin', // 携带cookie...options};// 处理GET请求的查询参数if (defaultOptions.method === 'GET' && defaultOptions.body) {const params = new URLSearchParams();for (const key in defaultOptions.body) {params.append(key, defaultOptions.body[key]);}url += '?' + params.toString();delete defaultOptions.body;}// 处理非GET请求的body数据if (defaultOptions.body && typeof defaultOptions.body === 'object') {defaultOptions.body = JSON.stringify(defaultOptions.body);}return fetch(url, defaultOptions).then(async response => {const data = await response.json().catch(() => ({}));if (!response.ok) {const error = new Error(response.statusText);error.response = response;error.data = data;throw error;}return data;});
}// 使用示例
fetchAjax('/api/user', {method: 'POST',body: { name: 'John', age: 30 },headers: {'Authorization': 'Bearer token123'}
})
.then(data => console.log('Success:', data))
.catch(err => console.error('Error:', err));
方法 3. 基于 Axios 风格的封装
class Ajax {constructor(baseURL = '', timeout = 10000) {this.baseURL = baseURL;this.timeout = timeout;this.interceptors = {request: [],response: []};}request(config) {// 处理请求拦截器let chain = [this._dispatchRequest, undefined];this.interceptors.request.forEach(interceptor => {chain.unshift(interceptor.fulfilled, interceptor.rejected);});this.interceptors.response.forEach(interceptor => {chain.push(interceptor.fulfilled, interceptor.rejected);});let promise = Promise.resolve(config);while (chain.length) {promise = promise.then(chain.shift(), chain.shift());}return promise;}_dispatchRequest(config) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest();let url = config.baseURL ? config.baseURL + config.url : config.url;let data = config.data;// 处理GET请求参数if (config.method === 'GET' && data) {const params = new URLSearchParams();for (const key in data) {params.append(key, data[key]);}url += '?' + params.toString();data = null;}xhr.timeout = config.timeout || 10000;xhr.open(config.method, url, true);// 设置请求头if (config.headers) {for (const key in config.headers) {xhr.setRequestHeader(key, config.headers[key]);}}xhr.onload = function() {if (xhr.status >= 200 && xhr.status < 300) {let response = xhr.responseText;try {response = JSON.parse(response);} catch (e) {}resolve({data: response,status: xhr.status,statusText: xhr.statusText,headers: xhr.getAllResponseHeaders()});} else {reject(new Error(`Request failed with status code ${xhr.status}`));}};xhr.onerror = function() {reject(new Error('Network Error'));};xhr.ontimeout = function() {reject(new Error('Timeout'));};// 发送请求if (data && typeof data === 'object') {xhr.setRequestHeader('Content-Type', 'application/json');xhr.send(JSON.stringify(data));} else {xhr.send(data);}});}get(url, config = {}) {return this.request({...config,method: 'GET',url});}post(url, data, config = {}) {return this.request({...config,method: 'POST',url,data});}// 添加拦截器useRequestInterceptor(fulfilled, rejected) {this.interceptors.request.push({ fulfilled, rejected });return this.interceptors.request.length - 1;}useResponseInterceptor(fulfilled, rejected) {this.interceptors.response.push({ fulfilled, rejected });return this.interceptors.response.length - 1;}// 移除拦截器ejectRequestInterceptor(id) {if (this.interceptors.request[id]) {this.interceptors.request.splice(id, 1);}}ejectResponseInterceptor(id) {if (this.interceptors.response[id]) {this.interceptors.response.splice(id, 1);}}
}// 使用示例
const api = new Ajax('https://api.example.com');// 添加请求拦截器
api.useRequestInterceptor(config => {config.headers = config.headers || {};config.headers['Authorization'] = 'Bearer token123';return config;
});// 添加响应拦截器
api.useResponseInterceptor(response => {console.log('Response:', response);return response.data;
}, error => {console.error('Error:', error);return Promise.reject(error);
});// 发起请求
api.get('/user/123').then(data => console.log('User data:', data)).catch(err => console.error('Error:', err));api.post('/user', { name: 'John', age: 30 }).then(data => console.log('Created user:', data)).catch(err => console.error('Error:', err));
4. 封装要点总结
统一接口:提供一致的调用方式,如get(), post()等方法
参数处理:
GET请求自动拼接查询参数
POST请求自动处理Content-Type
拦截器机制:支持请求/响应拦截
错误处理:统一错误处理逻辑
Promise支持:返回Promise便于链式调用
超时处理:设置合理的请求超时时间
扩展性:支持自定义配置和拦截器
5. 实际项目中的增强功能
1.自动重试机制:
function withRetry(fn, retries = 3, delay = 1000) {return function(...args) {return new Promise((resolve, reject) => {function attempt(retryCount) {fn(...args).then(resolve).catch(err => {if (retryCount < retries) {setTimeout(() => attempt(retryCount + 1), delay);} else {reject(err);}});}attempt(0);});};
}// 使用示例
const ajaxWithRetry = withRetry(ajax, 3, 1000);
2.请求取消功能:
function createCancelToken() {let cancel;const token = new Promise((resolve, reject) => {cancel = reject;});return { token, cancel };
}// 在请求中检查取消token
function ajaxWithCancel(options) {const { token, cancel } = createCancelToken();const xhr = new XMLHttpRequest();const promise = new Promise((resolve, reject) => {// ...正常请求逻辑// 检查取消token.catch(err => {xhr.abort();reject(err);});});return { promise, cancel };
}
3.请求缓存:
const cache = new Map();function cachedAjax(options) {const cacheKey = JSON.stringify(options);if (cache.has(cacheKey)) {return Promise.resolve(cache.get(cacheKey));}return ajax(options).then(response => {cache.set(cacheKey, response);return response;});
}
根据项目需求选择合适的封装方式,小型项目可使用简单封装,大型项目建议使用成熟的库如Axios。
相关文章:
【HTML5】【AJAX的几种封装方法详解】
【HTML5】【AJAX的几种封装方法详解】 AJAX (Asynchronous JavaScript and XML) 封装是为了简化重复的异步请求代码,提高开发效率和代码复用性。下面我将介绍几种常见的 AJAX 封装方式。 方法1. 基于原生 XMLHttpRequest 的封装 XMLHttpRequest。其主要特点如下…...
STM32 __rt_entry
STM32中__rt_entry函数的深度解析 在STM32的启动流程中,__rt_entry是一个由ARM C库提供的核心函数,负责在__main完成基础初始化后,搭建完整的C语言运行环境。以下是其核心功能及工作机制的详细分析: 一、__rt_entry的核心作用 …...
YOLOv11融合[AAAI2025]的PConv模块
YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection》 一、 模块介绍 论文链接:https://…...
point3d 视野朝向设置
这里写自定义目录标题 point3d 视野朝向设置三维相机朝向的直观理解 point3d 视野朝向设置 open3d.visualization.Visualizer 中的 get_view_control() 方法返回一个 ViewControl 对象,用来控制 3D 可视化窗口中的相机视角。通过这个对象可以设置视角朝向ÿ…...
基于大模型的腰椎管狭窄术前、术中、术后全流程预测与治疗方案研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、腰椎管狭窄概述 2.1 定义与分类 2.2 发病原因与机制 2.3 临床表现与诊断方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用案例 3.3 选择大模型预测腰椎管狭窄的依据 四、…...
Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解
Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解 目录 Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解效果一览基本介绍程序设计参考资料效果一览 基本介绍 Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解 可直接运行 分解效果好 适合作为创新点(Matlab完整源码和数据),…...
工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理
TDR真的是一个用来看阻抗跟Delay的好工具,通过一个Port的测试就可以看到通道各个位置的阻抗变化。 可是使用上其实没这么单纯,有很多细节需要非常地小心,才可以真正地看到您想看的信息! 就让我们整理3个极为重要的TDR使用小细节&…...
Spring Boot 项目中什么时候会抛出 FeignException?
在 Spring Boot 项目中使用 Feign 时,FeignException 是 Feign 客户端在执行 HTTP 请求过程中可能抛出的基础异常。它有很多子类,分别对应不同类型的错误。以下是一些常见的会抛出 FeignException (或其子类) 的情况: 网络连接问题 (Network …...
Spring Boot Swagger 安全防护全解析:从旧版实践到官方规范
摘要 本文系统梳理 Swagger 安全防护的核心方案,涵盖旧版 Swagger(SpringFox)的swagger.basic配置实践、官方推荐的 Spring Security 方案,以及多环境管理、反向代理过滤等全链路技术。结合权威文档,明确不同方案的适…...
基于 PLC 的轮式服务机器人研究
标题:基于 PLC 的轮式服务机器人研究 内容:1.摘要 本文以轮式服务机器人为研究对象,探讨基于可编程逻辑控制器(PLC)的设计与实现。在智能化服务需求不断增长的背景下,旨在开发一种具备稳定运动控制和高效服务功能的轮式服务机器人…...
emed64_20.9.2.msi 安装步骤(超简单版)
找到安装包 首先,先下载安装包链接:https://pan.quark.cn/s/2efb908815a4(可能在下载文件夹或者别人发给你的位置),双击它就行。如果双击没反应,就右键点它,选“安装”。 弹出安装向导 这时候会…...
HTML、CSS 和 JavaScript 基础知识点
HTML、CSS 和 JavaScript 基础知识点 一、HTML 基础 1. HTML 文档结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…...
直接在Excel中用Python Matplotlib/Seaborn/Plotly......
本次分享如何利用pyxll包,实现直接在Excel中使用Python Matplotlib/Seaborn/Plotly等强大可视化工具。 pyxll配置 pyxll安装 pip install pyxll pyxll install pyxll自定义方法 例如,自定义一个计算斐波那契数的方法fib,并使用pyxll装饰器…...
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-5
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-5 第一轮面试:业务场景切入 面试官(技术总监): 欢迎郑薪苦参与今天的面试。我们先从一个实际业务场景谈起——假设你正在设计一个电商平台的优惠券服务系统&…...
KV cache 缓存与量化:加速大型语言模型推理的关键技术
引言 在大型语言模型(LLM)的推理过程中,KV 缓存(Key-Value Cache) 是一项至关重要的优化技术。自回归生成(如逐 token 生成文本)的特性决定了模型需要反复利用历史token的注意力计算结果&#…...
[250512] Node.js 24 发布:ClangCL 构建,升级 V8 引擎、集成 npm 11
目录 Node.js 24 版本发布:Windows 平台构建工具链转向 ClangCL Node.js 24 版本发布:Windows 平台构建工具链转向 ClangCL 流行的开源跨平台 JavaScript 运行时环境 Node.js 近日发布了 24.0 版本。此版本带来了多项性能提升、安全增强和开发体验的改进…...
Linux常用命令39——free显示系统内存使用量情况
在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,free命令的功能是显示系统内存使用量情况,包含物理内存和交换内存的总量、使用量、空闲量情况。本篇学习记录free命令的基本使用。 首先查看帮助文档: 语法格…...
4. 文字效果/2D-3D转换 - 3D翻转卡片
4. 文字效果/2D-3D转换 - 3D翻转卡片 案例:3D产品展示卡片 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">.scene {width: 300px;height…...
游戏引擎学习第276天:调整身体动画
运行游戏,演示我们遇到的拉伸问题,看起来不太好,并考虑切换到更顶视角的视角 我们开始讨论游戏开发中的一些美学决策,特别是在处理动画方面。虽然我们是游戏程序员,通常不负责设计或艺术部分,但因为这是一…...
Java线程池性能优化全解析:从配置到实践
一、线程池配置原则 1.1 核心参数设定 线程池的性能优化始于合理配置,关键参数包括: 核心线程数(corePoolSize) CPU密集型任务:设为Runtime.getRuntime().availableProcessors()(通常为CPU核心数)IO密集型任务:设为CPU核心数 * 2(或更高,根据IO等待时间调整)最大线…...
【入门】歌德巴赫猜想
描述 任一个大于等于4的偶数都可以拆分为两个素数之和。 输入描述 一个整数n( 4 < n < 200 ) 输出描述 将小于等于n的偶数拆分为2个质数之和,列出所有方案! 用例输入 1 10 用例输出 1 422 633 835 1037 1055 #include<b…...
kafka----初步安装与配置
目录标题 ⭐kafka 与 zookeeper间的关系一.集群部署二.修改配置文件三.分发安装包四.启动与关闭 kafka 与 zookeeper 相同,是以集群的形式使用 ⭐kafka 与 zookeeper间的关系 kafka 的使用 要在 zookeeper 集群配置好的基础上 使用要想启动kafka 要先启动 zookeep…...
如何通过 Windows 图形界面找到 WSL 主目录
WSL(Windows Subsystem for Linux)是微软开发的一个软件层,用于在 Windows 11 或 10 上原生运行 Linux 二进制可执行文件。当你在 WSL 上安装一个 Linux 发行版时,它会在 Windows 内创建一个 Linux 环境,包括自己的文件系统和主目录。但是,如何通过 Windows 的图形文件资…...
Cursor 编辑器 的 高级使用技巧与创意玩法
以下是针对 Cursor 编辑器 的 高级使用技巧与创意玩法 深度解析,涵盖代码生成优化、工作流定制、隐藏功能等层面,助你将 AI 辅助编程效率提升至新高度: 一、代码生成进阶技巧 1. 精准控制生成粒度 行级控制: 在代码行内用 // > 指定生成方向(替代模糊注释)def merge_…...
element-ui 源码调用接口跨域问题
今天在看 upload 组件源码时,在组件源码当中调用的本地启动的 nodejs 服务写的上传接口,遇到跨域问题: 问题一、在 upload.md 中调用 nodejs 服务中的 上传接口,控制台报跨域报错。 解决方法1:在根目录增加 vue.conf…...
Docker与PostgreSQL
1. 背景介绍 Docker是一种开源的容器化技术,它通过使用容器来隔离应用程序及其运行环境,使得开发人员能够快速、可靠地构建、部署和运行应用程序。Docker容器是轻量级的虚拟化单元,能够在任何支持Docker的操作系统上运行,从而消除…...
iVX 研发基座:大型系统开发的协作与安全架构实践
通过图形化开发、组件化封装和多厂商协作机制,iVX 解决了传统开发模式在效率、安全和扩展性上的痛点。文章结合政务、教育、企业等行业案例,展示其在数据治理、权限控制和 DevOps 等方面的创新实践,为大型系统开发提供完整的技术参考。 一、…...
Vxe UI vue vxe-table 实现表格数据分组功能,不是使用树结构,直接数据分组
Vxe UI vue vxe-table 实现表格数据分组功能,不是使用树结构,直接数据分组 查看官网:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:https://gitee.com/x-extends/vxe-table 代码 通过…...
基于TI AM6442+FPGA解决方案,支持6网口,4路CAN,8个串口
TI AM6442FPGA解决方案具有以下技术优势及适用领域: 一、技术优势 异构多核架构:AM6442处理器集成7个内核(2xCortex-A534xCortex-R5F1xCortex-M4F),可实现应用处理、实时控制和独立任务分核协同,满足…...
6. 多列布局/用户界面 - 杂志风格文章布局
6. 多列布局/用户界面 - 杂志风格文章布局 案例:多栏杂志排版 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">body {font-family: "…...
计算机系统----软考中级软件设计师(自用学习笔记)
目录 1、计算机的基本硬件系统 2、CPU的功能 3、运算器的组成 4、控制器 5、计算机的基本单位 6、进制转换问题 7、原码、反码、补码、移码 8、浮点数 9、寻址方式 10、奇偶校验码 11、海明码 12、循环冗余校验码 13、RISC和CISC 14、指令的处理方式 15、存储器…...
FPGA图像处理(六)------ 图像腐蚀and图像膨胀
默认迭代次数为1,只进行一次腐蚀、膨胀 一、图像腐蚀 1.相关定义 2.图像腐蚀效果图 3.fpga实现 彩色图像灰度化,灰度图像二值化,图像缓存生成滤波模块(3*3),图像腐蚀算法 timescale 1ns / 1ps // // Des…...
2025年RIS SCI2区,改进白鲸优化算法+复杂非线性方程组求解,深度解析+性能实测
目录 1.摘要2.白鲸优化算法BWO原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 本文提出了一种改进白鲸优化算法(ABWOA)用来解决非线性方程组(SNLEs)求解问题。ABWOA引入了平衡因子和非线性自适应参数࿰…...
【论信息系统项目的资源管理】
论信息系统项目的资源管理 前言一、规划好资源管理,为保证项目完成做好人员规划二、估算活动资源,为制订项目进度计划提供资源需求三、获取项目资源,组建一个完备的项目团队四、建设项目团队,提高工作能力,促进团队成员…...
开发与AI融合的Windsurf编辑器
Windsurf编辑器是开发人员和人工智能真正融合在一起的地方,提供了一种感觉像文字魔术的编码体验。 手册:Windsurf - Getting Started 下载链接:Download Windsurf Editor for Windows | Windsurf (formerly Codeium) 下载安装 从上面的下载…...
maven工程跳过@SpringTest
每次跑springboot都比较费劲,会自动测试所有的SpringBootTest的类,这里对根pom添加这个插件,即可跳过测试,实测节省时间2分钟以上 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>ma…...
算法竞赛相关 Java 二分模版
目录 找和目标值相关 方法 Arrays.binarySearch(); 二分答案模版 找和目标值相关 public class BinarySearchTemplate {// 查找大于 x 的最小值(即严格上界)public static int upperBound(int[] arr, int x) {int left 0, right arr.length;while (…...
如何使用远程桌面控制电脑
目的: 通过路由器使用pc控制台式机,实现了有线/无线pc与台式机的双向远程桌面控制 最核心就两条:get ip地址与被控制机器的账户与密码。 现象挺神奇:被控制电脑的电脑桌面处于休眠模式,此时强行唤醒被控电脑会导致中断…...
运行Spark程序-在shell中运行1
(一)分布式计算要处理的问题 【老师提问:分布式计算要面临什么问题?】 【老师总结】 分布式计算需要做到: 1.分区控制。把大的数据拆成一小份一小份的(分区,分片)让多台设备同时计算…...
多边形,矩形,长方体设置
在cesium中,我们可以通过既有的库来进行对地图的构建 // 向场景中添加一个几何体(立方体) scene.primitives.add(new Cesium.Primitive({// 定义几何体实例geometryInstances: new Cesium.GeometryInstance({// 使用BoxGeometry.fromDimensions方法创建…...
3.3 阶数的作用
第一步:引入背景与动机 在数学中,特别是在使用泰勒公式进行函数近似时,阶数的选择对结果的精度和适用范围有着重要影响。阶数越高,近似的精度通常也越高,但计算复杂度也会增加。因此,理解不同阶数的作用及…...
OAuth安全架构深度剖析:协议机制与攻防实践
目录 一、OAuth协议核心架构解析 1. 协议框架与核心组件 2. 授权流程类型对比 二、OAuth安全漏洞技术原理与攻击向量 1. 重定向URI劫持攻击 2. 令牌注入与滥用 3. 跨站请求伪造(CSRF) 三、纵深防御体系构建指南 1. 协议层加固 2. 工程化防护 3…...
关于网站提交搜索引擎
发布于Eucalyptus-blog 一、前言 将网站提交给搜索引擎是为了让搜索引擎更早地了解、索引和显示您的网站内容。以下是一些提交网站给搜索引擎的理由: 提高可见性:通过将您的网站提交给搜索引擎,可以提高您的网站在搜索结果中出现的机会。当用…...
一文理清人工智能,机器学习,深度学习的概念
目录 一、人工智能的起源与核心范畴(1950-1980) 1.1 智能机器的最初构想 1.2 核心范畴的初步分化 二、机器学习的兴起与技术分化(1980-2010) 2.1 统计学习的黄金时代 2.2 神经网络的复兴与子集定位 2.3 技术生态的形成与AI…...
MySQL 数据库:创建新数据库和数据表全攻略
MySQL 数据库:创建新数据库和数据表全攻略 在 MySQL 数据库管理中,创建新的数据库和数据表是基础且关键的操作。无论是开发新的应用程序,还是对现有数据进行整理和存储,都离不开这些操作。本文将详细介绍如何在 MySQL 中创建新数…...
React Native 与 Expo
🧩 Expo 和 React Native 的关系 项目定义React Native一个由 Meta(Facebook)开发的原生移动端开发框架,使用 JavaScript React 来构建 iOS 和 Android 应用Expo一个构建在 React Native 之上的开发工具链,封装了很多…...
【RabbitMQ】七种工作模式介绍
文章目录 1. 简单模式2. 工作队列模式3. 发布订阅模式交换机类型 Publish/Subscribe 模式 4. Routing(路由模式)5. Topics(通配符模式)6. RPC(RPC 通信)7. Publisher Confirms(发布确认…...
【C++进阶篇】二叉搜索树的实现(赋源码)
掌握二叉搜索树:从基础知识到实际应用的全貌 一. 二叉搜索树简介1.1 基本概念1.2 意义与价值1.3 典型应用场景1.4 性能分析1.5 总结与展望 二. 搜索二叉树实现2.1 插入2.2 查找2.3 删除2.3.1 单或无孩型2.3.2 双孩型2.3.4 整合代码 三. ⼆叉搜索树key和key/value使⽤…...
LLMs 其他 Trick
huggingface 下载不了模型问题? from modelscope.hub.snapshot_download import snapshot_download model_dir snapshot_download(damo/nlp_xlmr_named-entity-recognition_viet- ecommerce-title, cache_dirpath/to/local/dir, revisionv1.0.1) 方法一࿱…...
2025年金融创新、区块链与信息技术国际会议(FRCIT 2025 2025)
2025 International Conference on Financial Innovation, Regional Chains, and Information Technology (一)会议信息 会议简称:FRCIT 2025 大会地点:中国郑州 收录检索:提交Ei Compendex,CPCI,CNKI,Google Schola…...