极简三分钟ES6 - ES9中Promise扩展

ES9中新增了Promise.prototype.finally(),我们来学习下

在之前的学习中,我们知道了then方法和catch方法,现在我们可以想象在一个完整的外卖订餐流程中

  • then() → 外卖送到后开吃(成功)
  • catch() → 送餐出错处理(失败)
  • finally()无论成败都要被告知(必执行)
js 复制代码
// 订餐流程
orderFood()
  .then(food => console.log(` 享用${food}`))     // 成功吃上 
  .catch(err => console.log(" 投诉:", err))       // 失败处理
  .finally(() => console.log(" 收拾碗筷"));       // 必执行 

特性描述

  • 无视成败:无论Promise成功/失败都执行
  • 无参数:不接收任何结果值
  • 链式传递:返回原Promise结果(不改变结果)

一些常见的使用场景

关闭加载动画

js 复制代码
let isLoading = true;
 
fetchData()
  .then(data => render(data))
  .catch(err => showError(err))
  .finally(() => {
    isLoading = false; // 必关闭加载状态
    spinner.hide(); 
  });

记录操作结束

js 复制代码
trackUserAction()
  .finally(() => {
    console.log(`[${new  Date()}] 用户操作完成`);
    // 无论成功失败都记录
  });

替代重复代码(避免then/catch双写)

js 复制代码
// 旧写法(ES6)
fetchData()
  .then(data => {
    process(data);
    cleanup(); // 成功时需要清理
  })
  .catch(err => {
    handleError(err);
    cleanup(); // 失败时也要清理 → 重复!
  });
 
// 新写法(ES9)
fetchData()
  .then(process)
  .catch(handleError)
  .finally(cleanup); // 只需写一次 

finally中的异步操作

js 复制代码
deleteFile()
  .finally(() => {
    return backupLog(); // 返回新Promise
  })
  .then(() => console.log(" 备份完成"))
  .catch(err => console.log(" 备份失败", err));

finally抛出错误

js 复制代码
saveData()
  .finally(() => {
    throw new Error("清理异常"); // 会覆盖原结果
  })
  .catch(err => console.log(err));  // 捕获清理错误

与async/await结合

js 复制代码
async function fetchWithCleanup() {
  try {
    const data = await fetchAPI();
  } catch (err) {
    handleError(err);
  } finally { // 等效语法 
    releaseResources();
  }
}

与传统方案相比

场景 ES6方案 ES9 finally方案 优势
关闭数据库连接 then/catch中重复调用db.close() .finally(db.close) 避免代码重复
隐藏加载动画 每个分支写spinner.hide() 集中写在finally 减少50%代码量
释放文件句柄 可能遗漏错误分支 确保100%执行 防止资源泄漏

牢记

finally作为Promise的兜底保障,必执行 (无视成功失败),资源管理 (防止内存泄漏), 代码精简(消除重复逻辑)

相关推荐
程序员agions2 分钟前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发3 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_10 分钟前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞0511 分钟前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、16 分钟前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao16 分钟前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
杨超越luckly22 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
hedley(●'◡'●)1 小时前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_8115175151 小时前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育1 小时前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育