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

JS 请求处理:从 “回调地狱” 到 “并发控制”,我封装了能复用 10 个项目的请求工具

看着屏幕上密密麻麻全是嵌套的 then—— 为了实现 “先获取用户 Token,再拿用户信息,最后加载购物车”,写了三层 then 嵌套,中间还夹杂着错误处理,代码缩进比面条还乱。

“我也不想这么写啊,但请求得等前一个结束才能发,不然拿不到 Token!” KK 揉着太阳穴说。

那段代码长这样,你眼熟吗?

javascript

运行

// 老周的“面条代码”:嵌套then处理依赖请求
fetch('/api/getToken').then(tokenRes => tokenRes.json()).then(tokenData => {// 第一层then:拿到Token后,请求用户信息fetch('/api/getUserInfo', {headers: { Authorization: `Bearer ${tokenData.token}` }}).then(userRes => userRes.json()).then(userData => {// 第二层then:拿到用户信息后,请求购物车fetch('/api/getCart', {headers: { Authorization: `Bearer ${tokenData.token}` }}).then(cartRes => cartRes.json()).then(cartData => {// 第三层then:终于拿到所有数据renderUser(userData);renderCart(cartData);}).catch(cartErr => console.error('购物车请求错了:', cartErr));}).catch(userErr => console.error('用户信息请求错了:', userErr));}).catch(tokenErr => console.error('Token请求错了:', tokenErr));

这就是前端请求处理的经典痛点:回调地狱、错误处理分散、重复配置冗余。更麻烦的是,这种代码在项目里复制粘贴几次后,一旦后端改了接口地址或请求头格式,就得全局找代码修改,堪称 “维护噩梦”。

今天就结合我在电商、后台系统里踩过的坑,分享一套 “从基础封装到进阶优化” 的请求处理方案 —— 从解决回调地狱,到封装可复用的请求工具,再到处理并发控制、请求取消这些实战场景,每个步骤都有可直接复制的代码,最后还会给一个我用了 10 个项目的请求工具模板。

一、先解决最痛的 “回调地狱”:用 async/await 让代码变 “平”

回调地狱的根源是 “异步请求依赖”—— 后一个请求需要前一个的结果。早期用 then 嵌套解决,代码越写越乱;ES7 的 async/await 就是为这个问题而生的,能把异步代码写成 “同步的样子”,可读性直接拉满。

错误写法(嵌套 then):

前面那段 “三层嵌套” 代码就是典型反例,这里不再重复 —— 核心问题是 “嵌套层级深、错误处理分散”,想改中间某个请求的逻辑,得一层层扒开代码。

正确写法:用 async/await 重构

把每个请求封装成单独的函数,再用 async/await 按顺序调用,代码瞬间变平:

javascript

运行

// 1. 先封装单个请求函数(返回Promise)
async function getToken() {const res = await fetch('/api/getToken');if (!res.ok) {// 主动抛错,让外面的catch能捕获throw new Error(`Token请求失败:${res.status}`);}const data = await res.json();return data.token; // 直接返回需要的Token,不用外层再解析
}async function getUserInfo(token) {const res = await fetch('/api/getUserInfo', {headers: { Authorization: `Bearer ${token}` }});if (!res.ok) {throw new Error(`用户信息请求失败:${res.status}`);}return res.json();
}async function getCart(token) {const res = await fetch('/api/getCart', {headers: { Authorization: `Bearer ${token}` }});if (!res.ok) {throw new Error(`购物车请求失败:${res.status}`);}return res.json();
}// 2. 用 async/await 按顺序调用,错误统一处理
async function loadAllData() {try {// 按顺序执行:先拿Token,再拿用户信息,最后拿购物车const token = await getToken();const userInfo = await getUserInfo(token);const cartData = await getCart(token);// 所有请求成功后,再渲染页面renderUser(userInfo);renderCart(
http://www.dtcms.com/a/558765.html

相关文章:

  • VSCode中Kilo Code插件集成终端输出中文乱码问题解决
  • 影响网站排名的因素 权重网站建设教程视频百度云
  • 第三十四篇:对象的“自我介绍”:__str__和__repr__魔法方法的区别与实现
  • 11-MySQL事务管理
  • 36氪国外做网站微信营销模式有哪些
  • seo网站优化推广教程做简单的html网站
  • ftp怎么做网站南宁建站模板大全
  • 中国空间站拒绝10国名单什么是线上推广
  • 网站开发部门叫什么wordpress右浮动
  • 网站开发之前前后端不分离百度怎么搜索图片
  • 安徽企业网站建设公司域名未做运行网站解析
  • 说一下,项目中单点登录的实现原理
  • 网站建设用书建设一个网站的需求分析
  • CUDA C++编程指南(1)——简介
  • 哪做网站最好程序员做的简单的网站
  • 不同的网站 做301百度网站登录
  • 厦门做网站软件网站建设公司好吗
  • 昆明学校网站设计公司搜索引擎优化与推广技术
  • 网站建设单位哪家好设计师接单的网站
  • 便宜做网站抖音代运营广州
  • 到底什么是:对称加密/非对称加密--公钥和密钥(下)
  • 恋爱网站建设成都小程序开发公司有哪些
  • 单位网站设计制作拓者设计吧注册还要钱
  • 赣州那里有做网站的公司长沙做网站seo优化外包
  • 上海自主建站模板手机高端网站建设
  • 开发指南140-跨服务数据范围限定
  • 网站建设实践心得体会wordpress 固定导航
  • 做网站可以不写代码百度推广投诉人工电话
  • Spring AI--工具调用
  • 网站的分辨率是多少平面设计师招聘广告文案