微信小程序 wx.request() 的封装

基于微信小程序的wx.request()方法封装

下面是一个封装方案,满足您提出的所有要求:

class HttpService {constructor() {this.baseUrl = ''; // 基础URLthis.pendingRequests = new Map(); // 请求缓存池this.interceptors = {request: [],response: []};}// 设置基础URLsetBaseUrl(url) {this.baseUrl = url;}// 添加拦截器useInterceptor(type, handler) {if (this.interceptors[type]) {this.interceptors[type].push(handler);}}// 核心请求方法async request(config) {const { url, method = 'GET', data = {}, header = {}, showLoading = false } = config;// 生成请求唯一标识const requestKey = `${method}_${url}_${JSON.stringify(data)}`;// 检查重复请求if (this.pendingRequests.has(requestKey)) {return this.pendingRequests.get(requestKey);}// 请求前拦截处理let finalConfig = { url, method, data, header, showLoading };for (const interceptor of this.interceptors.request) {finalConfig = await interceptor(finalConfig) || finalConfig;}// 创建请求Promiseconst requestPromise = new Promise((resolve, reject) => {// 显示加载状态if (finalConfig.showLoading) {wx.showLoading({ title: '加载中', mask: true });}wx.request({url: this.baseUrl + finalConfig.url,method: finalConfig.method,data: finalConfig.data,header: finalConfig.header,success: async (res) => {// 响应后拦截处理let processedRes = res;for (const interceptor of this.interceptors.response) {processedRes = await interceptor(processedRes) || processedRes;}resolve(processedRes);},fail: (err) => {// 错误处理拦截let processedErr = err;for (const interceptor of this.interceptors.response) {processedErr = interceptor(processedErr) || processedErr;}reject(processedErr);},complete: () => {// 隐藏加载状态if (finalConfig.showLoading) {wx.hideLoading();}// 从缓存池移除this.pendingRequests.delete(requestKey);}});});// 缓存当前请求this.pendingRequests.set(requestKey, requestPromise);return requestPromise;}// 并发请求处理all(requests) {return Promise.all(requests);}// 快捷方法:GETget(url, params = {}, config = {}) {return this.request({...config,url,method: 'GET',data: params});}// 快捷方法:POSTpost(url, data = {}, config = {}) {return this.request({...config,url,method: 'POST',data});}// 快捷方法:PUTput(url, data = {}, config = {}) {return this.request({...config,url,method: 'PUT',data});}// 快捷方法:DELETEdelete(url, params = {}, config = {}) {return this.request({...config,url,method: 'DELETE',data: params});}
}// 创建实例
const http = new HttpService();// 设置基础URL(示例)
http.setBaseUrl('https://api.example.com');// 添加请求拦截器(示例:添加token)
http.useInterceptor('request', (config) => {const token = wx.getStorageSync('token');if (token) {config.header = {...config.header,Authorization: `Bearer ${token}`};}return config;
});// 添加响应拦截器(示例:错误处理)
http.useInterceptor('response', (response) => {if (response.statusCode !== 200) {wx.showToast({title: `请求错误: ${response.data.message || '未知错误'}`,icon: 'none'});throw new Error('请求失败');}return response.data;
});

功能说明

  1. 加载状态控制

    • 通过showLoading参数控制是否显示加载动画
    • 默认不显示,需要时手动开启
    • 使用微信原生showLoading/hideLoading方法
  2. 拦截器系统

    • 请求拦截器:在请求发送前修改配置
    • 响应拦截器:处理响应数据和错误
    • 支持添加多个拦截器,按添加顺序执行
  3. 并发请求处理

    • all()方法处理多个并发请求
    • 内部使用Promise.all实现
    • 示例用法:
      const [userData, productList] = await http.all([http.get('/user'),http.get('/products')
      ]);
      

  4. 重复请求过滤

    • 使用请求方法+URL+参数的哈希值作为唯一标识
    • 相同请求返回缓存中的Promise对象
    • 避免网络资源浪费
  5. 快捷方法

    • 内置GET/POST/PUT/DELETE快捷方法
    • 简化常用请求调用
    • 示例:
      // GET请求
      const data = await http.get('/api/data', { page: 1 });// POST请求
      await http.post('/api/submit', { name: 'John' }, { showLoading: true });
      

使用示例

// 获取用户信息
async function fetchUser() {try {const user = await http.get('/user/profile', null, { showLoading: true });console.log('用户数据:', user);} catch (error) {console.error('获取用户信息失败', error);}
}// 提交表单数据
async function submitForm(data) {try {const result = await http.post('/form/submit', data, {showLoading: true,header: { 'Content-Type': 'application/json' }});wx.showToast({ title: '提交成功' });} catch (error) {// 错误已在拦截器处理}
}// 并发请求示例
async function fetchAllData() {try {const [orders, messages] = await http.all([http.get('/user/orders'),http.get('/user/messages')]);console.log('订单数据:', orders);console.log('消息数据:', messages);} catch (error) {console.error('数据获取失败', error);}
}

这个封装方案具有以下优势:

  1. 完整的拦截器系统支持预处理和后处理
  2. 智能的请求缓存机制避免重复请求
  3. 简洁的API设计降低使用复杂度
  4. 完善的错误处理流程
  5. 灵活的加载状态控制
  6. TypeScript友好,可轻松添加类型定义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89620.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolo8实时识别目标(和平精英敌人+骨骼关键点)

现在需要识别人物的肢体(姿态/骨骼关键点),即所谓的「姿态估计(pose estimation)」,以下是一些主流、训练好可直接使用的开源模型推荐,支持多人识别与骨骼关键点检测,适合你后续用于…

MyBatis动态SQL全解析:五大核心标签实战指南

MyBatis动态SQL全解析:五大核心标签实战指南 一、动态SQL的价值:告别硬编码时代 传统SQL拼接的痛点 // 传统方式需要手动拼接SQL字符串 StringBuilder sql new StringBuilder("SELECT * FROM orders WHERE 11"); if (status ! null) {sql.app…

线上 CPU 过高怎么排查

通过以下几个命令解决1、top命令,找到 CPU 过高的pid(进程); ​编辑 2、根据pid(进程)找到CPU过高的线程id;top -H -p pid(进程)3、把线程id转换16 进制的printf 0x%x\n 线程id4、导致CPU 飙升的线程异常信息,-A 30表示打印 30 行记录jstack pid(进程id)…

Letter Combination of a Phone Number

IntroduceProblem Analysis (Using “258” as example) //2 a b c //5 j k l //8 t u vPossible letter combinations: a, j, t (no further options, this is one combination)a, j, u (no further options, another combination)a, j, v (another c…

【问题解决】npm包下载速度慢

问题描述: npm包下载速度慢 问题原因: 为什么下载 npm 包速度慢? 在使用npm下包的时候,默认从国外的https://regitry.npmjs.org/服务器进行下载。此时,网络数据的传输需要经过漫长的海底光缆,因此下包速度…

Apache DolphinScheduler介绍与部署

目录 一、软件介绍 1、软件概述 2、发展历史 3、名词解释 4、模块介绍 软件部署 1、下载发布包 2、上传与解压 3、启动 4、浏览器验证 一、软件介绍 1、软件概述 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&…

Selenium 启动的浏览器自动退出问题分析

当 Selenium 启动的浏览器自动关闭时,通常是由于以下原因导致的:1. 脚本执行完毕原因:Selenium 脚本执行到末尾时,如果没有保持浏览器打开的代码(如time.sleep()或循环),浏览器会自动关闭。解决…

rust实现的快捷补全到剪贴板的实用工具

最近在兼职项目中老是遇到这样的场景: 在云服务器之间通过scp命令传输文件,密码太长记不住(客户服务器不方便ssh-copy-id)在服务器上使用mysql命令登录修改数据,数据库密码太长记不住(客户设置的密码,直接改掉哈&#…

信息系统风险的安全技术防范思路

针对信息系统风险的安全技术防范思路 降低风险,即提升了安全能力和水平 保护资产 加强信息系统软硬件及数据安全保护;减少脆弱性 通过研发、部署、应用各环节来尽量减少或避免脆弱性;应对威胁 采取防御措施,实施攻防对抗。

Java项目:基于SSM框架实现的网盘管理系统【ssm+B/S架构+源码+数据库+毕业论文】

摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此文件信息的管理…

Echart 地图放大缩小

文章目录 常用方法 1. **开启 `roam` 属性** 2. **通过鼠标滚轮或手势缩放** 3. **设置初始缩放比例** 4. **通过按钮控制缩放** 5. **限制缩放范围** 6. **监听缩放和平移事件** 7. **结合 `dataZoom` 实现数据缩放** 总结 相关文章 在 ECharts 中,可以通过设置地图的 roam …

针对VMware虚拟化环境迁移的复杂场景,我将从技术架构、迁移方案、代码实现、可视化流程四个维度进行专业解析,并提供完整的解决方案框架。

针对VMware虚拟化环境迁移的复杂场景,我将从技术架构、迁移方案、代码实现、可视化流程四个维度进行专业解析,并提供完整的解决方案框架。一、技术架构分析(架构图表格对比)graph TDA[源环境] -->|vMotion| B[目标环境]A -->…

揭秘 AIGC 背后的技术:GPT、BERT 与 Transformer 模型的工作原理

一、引言AIGC 的崛起与重要性人工智能生成内容(AIGC)已经不再是未来的技术,它正以惊人的速度渗透到各行各业,重新定义了内容创作、媒体生产、甚至人类认知的边界。从深度学习到大规模自然语言处理,AIGC 的崛起代表着一…

Compose笔记(三十五)--ModalBottomSheetLayout

这一节主要了解一下Compose中的ModalBottomSheetLayout,在Jetpack Compose开发中,ModalBottomSheetLayout是Material Design组件库中用于实现模态底部面板的核心组件,其核心作用是通过声明式API管理底部面板的显示、隐藏及交互逻辑。API Moda…

AWS Partner: Accreditation (Technical)

AWS Partner: Accreditation (Technical)AWS 核心技术简介云计算的优势AWS 全球基础设施核心技术:计算 Amazon Elastic Compute Cloud (Amazon EC2)存储数据库联网安全性从服务到解决方案解决方案设计简介迁移策略架构最佳实践AWS Well-Archi…

【52】MFC入门到精通——(CComboBox)下拉框选项顺序与初始化不一致,默认显示项也不一致

文章目录1 问题描述2 问题分析与解决上一讲,我们实现了MFC串口助手初级版。 MFC入门到精通——MFC串口助手(一)—初级版(串口设置、初始化、打开/关闭、状态显示),附源码1 问题描述 程序运行后串口默认参数,与我们预期不完全一致…

Astro:前端性能革命!从原生 HTML 到 Astro + React 的升级指南

为什么程序员必须关注 Astro在网站性能和 SEO 日益关键的今天,静态站点生成(SSG)再次成为焦点。Astro 作为一款专为内容驱动网站设计的现代前端框架,正引领一场轻盈革命。它强调服务器优先渲染,将页面预先转为纯 HTML&…

格式转换Total Excel Converter:20 种格式XLS XLSX 批量转 PDFWord

各位办公小能手们!今天给大家介绍一款超厉害的软件,叫Total Excel Converter,软件下载地址安装包 它可是专业的Excel文件格式转换工具。你知道吗,它能把Excel工作簿,像XLS、XLSX、XLSM这些格式,批量转换成…

Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用【AI记录用】

在 Java 多线程编程中,Thread、ThreadLocal 和 ThreadLocalMap 是三个紧密相关的类,它们共同构成了 Java 中**线程本地变量(Thread-Local Storage)**机制的基础。下面我将从 三者的关系、实现原理 以及 实际开发中的应用 三个方面…

[故障诊断方向]SNNs:针对小样本轴承故障诊断的孪生神经网络模型

目录 1. ​引言与背景总结​ 2. ​方法框架总结​ 3. ​训练策略总结​ 4. ​实验验证总结​ 核心代码实现(PyTorch框架) ​1. SNN特征提取器(多尺度卷积模块) ​结论与未来工作总结​ 1. ​引言与背景总结​ ​问题陈述​…