首页 游戏 软件 资讯 排行榜 专题
首页
前端开发
如何用 Promise.prototype.finally 统一处理无论请求成功还是失败都要隐藏的骨架屏

如何用 Promise.prototype.finally 统一处理无论请求成功还是失败都要隐藏的骨架屏

热心网友
64
转载
2026-04-17

如何利用 Promise.prototype.finally 统一隐藏骨架屏,无论请求成功或失败

如何用 Promise.prototype.finally 统一处理无论请求成功还是失败都要隐藏的骨架屏

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

为什么 Promise.prototype.finally 是隐藏骨架屏的理想选择

核心原因在于其设计初衷:finally 方法专为执行“最终清理”任务而生。它不关心前一个 Promise 最终是成功兑现(fulfilled)还是被拒绝(rejected),只要 Promise 状态“已敲定”(settled),它就一定会执行。这完美匹配了“无论接口请求结果如何,最终都必须关闭骨架屏”的通用前端需求。

此外,finally 不接收任何参数,这保证了它不会意外修改链式调用传递下来的值,同时也不会吞噬上游抛出的错误。相比之下,在 thencatch 回调中分别编写隐藏骨架屏的逻辑,不仅会造成代码重复,还容易因遗漏导致界面卡住。finally 提供了一种更简洁、更可靠的一体化解决方案,有效提升代码可维护性。

在 fetch 请求中正确应用 finally 来关闭骨架屏

理解了原理,但实践中仍可能出错。一个常见误区是将 finally 仅放在错误处理分支之后,而忽略了成功处理链路中也可能抛出异常(例如 JSON 解析失败),这会导致骨架屏在某些情况下无法隐藏。

正确的做法是,将 finally 置于整个 Promise 链的末端,作为最终的、必然执行的清理步骤:

showSkeleton();
fetch('/api/data')
  .then(res => {
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    return res.json();
  })
  .then(data => render(data))
  .catch(err => handleError(err))
  .finally(() => hideSkeleton()); // 确保在任何情况下都会执行

当然,使用async/await语法也非常普遍。需要注意的是,finally不能直接跟在await表达式后面,此时经典的try...catch...finally语句块就成为了最佳选择:

showSkeleton();
try {
  const res = await fetch('/api/data');
  const data = await res.json();
  render(data);
} catch (err) {
  handleError(err);
} finally {
  hideSkeleton(); // 同样是最终的收尾位置
}

注意:在 finally 中修改共享状态可能引发竞态条件

这是在处理并发请求时容易遇到的进阶问题。设想一个场景:页面同时发起多个请求,它们共享同一个骨架屏的加载状态(例如一个全局的 isLoading 变量)。如果每个请求都在自己的 finally 回调中直接设置 isLoading = false,那么最先完成的请求会过早地关闭骨架屏,而此时其他请求可能仍在加载,导致页面状态混乱,用户体验受损。

如何解决这个并发请求下的骨架屏管理难题?以下是几种有效的策略:

  • 采用请求计数器:发起请求时执行 pendingCount++,在 finally 回调中执行 pendingCount--,并仅在计数器归零时,才真正执行隐藏骨架屏的操作。
  • 借助现代状态管理工具:使用 AbortController 进行精细的请求控制,或者直接采用如 React Query、SWR、VueUse 等前端数据请求库,它们内置了智能的 Loading 状态管理,能自动处理并发场景。
  • 从架构设计上隔离状态:避免使用全局共享的加载状态,改为让每个独立的 UI 组件或视图模块维护自身的 isPending 状态,由前端框架(如 React、Vue)来协调最终的渲染逻辑。

finally 不会阻止错误传播,但需警惕其潜在影响

这是一个关键但常被误解的特性。finally 执行完毕后,原始的 Promise 拒绝原因并不会被“消化”或阻止,它仍然会继续向调用链的上层传播。也就是说,finally 本身并非错误处理器。

然而,有一个重要的细节:如果你在 finally 回调函数内部主动 throw 了一个新的错误,或者返回了一个被拒绝的 Promise,那么这个新产生的错误将会取代并覆盖掉链中可能存在的原始错误。反之,如果 finally 回调正常执行完毕,则完全不影响错误的原有传播路径。因此,下面这种写法是安全的:

fetch('/api/data')
  .then(handleSuccess)
  .catch(handleError) // 在此处捕获并处理错误
  .finally(() => hideSkeleton()); // ✅ 执行后,任何未被捕获的错误仍会正常向外抛出

而下面这种写法则会带来问题,因为它掩盖了原始错误:

.finally(() => {
  hideSkeleton();
  return Promise.reject(new Error('finally broke it')); // ❌ 这个新抛出的错误会覆盖掉链中任何原有的错误信息
})

总而言之,在实际前端开发中,只要牢记finally最适合用于执行那些不改变最终结果、无副作用的“清理”操作——例如更新DOM状态、记录日志、清除定时器或隐藏骨架屏——就能安全地利用它,而无需担心它会破坏应用程序整体的错误处理流程。掌握这一点至关重要。

来源:https://www.php.cn/faq/2334678.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

CTA史诗级回补美股:单周860亿美元扫货,未来一周再加700亿
web3.0
CTA史诗级回补美股:单周860亿美元扫货,未来一周再加700亿

量化趋势追踪基金(CTA)强势回归:美股反弹的核心引擎与未来走势深度解析 近期,美股市场迎来一波强劲反弹,其背后一股关键力量正引发全球投资者高度关注——量化趋势追踪基金(CTA)正以历史罕见的速度重返市场。高盛最新分析揭示,这股系统性资金的动向已成为研判短期市场走向不可忽视的风向标。 860亿美元历

热心网友
04.17
连续黑白提神最大化技巧
游戏攻略
连续黑白提神最大化技巧

《连续黑白》提神效果最大化终极指南:突破系统限制的实战策略 你是否渴望在《连续黑白》中将提神效果的收益推向极致,甚至突破游戏机制的理论上限?本文将为你揭秘一套经过验证的高阶操作方案。其核心原理基于游戏内“提神”系统的分组冷却机制:效果分为A、B两组,冷却时间各异。常规的“小提神”仅触发A组,而“大提

热心网友
04.17
连续黑白黑奴玩法攻略
游戏攻略
连续黑白黑奴玩法攻略

《连续黑白》黑奴玩法深度解析:极限打工流的核心逻辑与节奏掌控 在《连续黑白》中,如何高效积累初始资本?“黑奴玩法”无疑是追求极致效率的经典策略。其核心逻辑清晰明确:在游戏前期,将全部时间与资源压榨到极限,专注于打工赚钱,并维持最低生存标准——睡眠时间归零,饮食选择“康师傅牛肉面”,住宿选择“地下室”

热心网友
04.17
2026 GEO 优化哪家好?合规与长期价值服务商排行,360 智见筑牢可信资产
业界动态
2026 GEO 优化哪家好?合规与长期价值服务商排行,360 智见筑牢可信资产

一、调研背景与市场趋势 时间来到2026年,市场环境已然不同。AI内容监管的收紧,加上金融、医疗、政务等行业对合规要求的全面升级,让企业的GEO优化策略不得不重新审视。过去那种只盯着短期流量、快速引流的玩法,如今已经行不通了。市场正在淘汰那些只顾短期效果、甚至不惜违规操作的供应商。取而代之的,是那些

热心网友
04.17
解锁9950X3D2极致潜能 华硕X870E主板当仁不让
科技数码
解锁9950X3D2极致潜能 华硕X870E主板当仁不让

AMD锐龙9 9950X3D2重磅登场:Zen 5架构与双3D V-Cache的王者组合 就在最近,AMD正式揭晓了其桌面处理器领域的全新力作——锐龙9 9950X3D2。这颗芯片的核心看点非常明确:它采用了最新的Zen 5架构,配备了16个核心和32个线程,基础频率设定在4 3GHz,而最高加速频

热心网友
04.17

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

开放世界哪家强?外媒评比R星&B社经典大作
游戏资讯
开放世界哪家强?外媒评比R星&B社经典大作

开放世界哪家强?R星与B社的两种哲学 说起21世纪的主流游戏类型,开放世界沙盒游戏绝对是个绕不开的标志。自从《GTA3》大获成功,将整个世界塞进玩家手里的想法,就成了无数开发商的梦想。在这条赛道上,Rockstar无疑是标杆——无论是《GTA》还是《荒野大镖客》系列,那种“世界任你闯”的自由度,确实

热心网友
04.17
欧易OKX官方网站网页版登录入口 OKX交易所2026官方App下载通道
web3.0
欧易OKX官方网站网页版登录入口 OKX交易所2026官方App下载通道

欧易OKX:从官网登录到App下载,一站式操作指南 在众多数字资产服务平台中,欧易OKX以其成熟的现货、合约等产品体系,成为全球用户的选择之一。对于新用户而言,第一步往往是找到正确的入口并完成账户设置。本文将为您清晰梳理欧易OKX官方网站的网页版登录入口、2026官方App的下载通道,并详解账户注册

热心网友
04.17
三星2nm良率升至60%,剑指1nm!Forksheet晶体管架构2030年前量产
科技数码
三星2nm良率升至60%,剑指1nm!Forksheet晶体管架构2030年前量产

进入2026年,三星晶圆代工的拐点来了? 2026年刚开局,三星的晶圆代工业务就透出一股不一样的气息。在关键的2nm制程节点上,无论是技术开发还是客户订单,近期传出的都是利好消息。最值得关注的一个进展是:三星的2nm GAA工艺良品率,已经摸到了60%的门槛。这意味着,距离业界公认具有竞争力的70%

热心网友
04.17
如何用 Promise.prototype.finally 统一处理无论请求成功还是失败都要隐藏的骨架屏
前端开发
如何用 Promise.prototype.finally 统一处理无论请求成功还是失败都要隐藏的骨架屏

如何利用 Promise prototype finally 统一隐藏骨架屏,无论请求成功或失败 为什么 Promise prototype finally 是隐藏骨架屏的理想选择 核心原因在于其设计初衷:finally 方法专为执行“最终清理”任务而生。它不关心前一个 Promise 最终是成功兑

热心网友
04.17
识质存在PC版引争议:路径追踪成唯一画质救星,基础渲染严
娱乐
识质存在PC版引争议:路径追踪成唯一画质救星,基础渲染严

卡普空新作《识质存在》PC版技术评测引争议:路径追踪成“画质分水岭”? 卡普空旗下备受期待的科幻新作《识质存在》,其PC版本的首批技术评测结果已经出炉。然而,评测带来的并非一片赞誉,而是玩家群体中普遍的质疑声浪。问题的核心,直指游戏在关闭路径追踪功能后的视觉表现:整体画质出现了令人意外的显著退化,甚

热心网友
04.17