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

Javascript的新能力:显式资源管理(Explicit Resource Management)

本文首发在我的个人博客上:Javascript的新能力:显式资源管理(Explicit Resource Management)https://www.brandhuang.com/article/1749888651434

本文不是原文翻译

英文原文地址:JavaScript's New Superpower: Explicit Resource Management

提案地址: https://github.com/tc39/proposal-explicit-resource-management

这是一个实验性语法提案

目前该提案处于 pending stage 4 阶段

从 Chromium v134和 V8 的 v13.8 开始提供支持。

图片描述

该提案的作用

通过一种显示方法来管理资源的生命周期,这里的资源包括:内存、I/O、文件操作(file handles)、网络连接等

提案引入的内容

  • using 和 await using
  • DisposableStack 和 AsyncDisposableStack

using / await using

用法:

using x = xxx;
await using x = xxx;

使用 using 或 await using 声明的变量,会在函数体、块或者模块结尾被处理,即作用域结束时自动触发 dispose 方法 ,

要自动触发 dispose / asyncDispose 方法的前提是要自己实现 dispose / asyncDispose 方法

提案之前的代码 VS 提案之后的代码

基础代码:

// 同步资源
class SyncResource {constructor(name) {this.name = name;console.log(`打开资源: ${name}`);}use() {console.log(`使用资源: ${this.name}`);}[Symbol.dispose]() {console.log(`释放资源: ${this.name}`);}
}// 异步资源
class AsyncResource {constructor(name) {this.name = name;}static async open(name) {console.log(`异步打开资源: ${name}`);await new Promise(r => setTimeout(r, 100));return new AsyncResource(name);}async use() {console.log(`异步使用资源: ${this.name}`);}async [Symbol.asyncDispose]() {console.log(`异步释放资源: ${this.name}`);await new Promise(r => setTimeout(r, 100));}
}
新提案之前
function withoutUsing() {const res = new SyncResource("Logger");try {res.use();} finally {res[Symbol.dispose]();}
}async function withoutAwaitUsing() {const res = await AsyncResource.open("DB");try {await res.use();} finally {await res[Symbol.asyncDispose]();}
}
提案之后

function withUsing() {using res = new SyncResource("Logger");res.use();
}
// 自动调用 res[Symbol.dispose](),即使出错也能释放

在作用域结束时自动释放资源,避免了忘记手动释放

DisposableStack / AsyncDisposableStack

  • 用于手动管理多个资源的释放顺序;
  • 遵循栈结构,注册的资源后进先出(LIFO);
  • 这两个对象提供一系列方法,比如use()adopt()defer()

使用示例:

function exampleUsingStack() {const stack = new DisposableStack();const file = {name: "log.txt",[Symbol.dispose]() {console.log(`关闭文件 ${this.name}`);}};const db = {name: "local.db",[Symbol.dispose]() {console.log(`关闭数据库 ${this.name}`);}};stack.use(file); // 注册 file 的释放stack.use(db);   // 注册 db 的释放stack.dispose(); // 自动依序调用 db → file 的释放逻辑
}
exampleUsingStack()
async function exampleAsyncStack() {const stack = new AsyncDisposableStack();const conn = {name: "async-db",async [Symbol.asyncDispose]() {console.log(`关闭异步连接 ${this.name}`);}};const tmpFile = {name: "temp.txt",async [Symbol.asyncDispose]() {console.log(`删除临时文件 ${this.name}`);}};stack.use(conn);stack.use(tmpFile);await stack.dispose(); // 顺序释放资源(tmpFile → conn)
}await exampleAsyncStack();

感谢你的阅读

相关文章:

  • Flask入门指南:从零构建Python微服务
  • WinForms视频播放开发实战指南
  • 公钥加密与签名算法计算详解(含计算题例子)
  • 股票T0程序化交易如何做?
  • MySQL的Sql优化经验总结
  • 【配置教程】新版OpenCV+Android Studio环境配置(4.11测试通过)
  • MySQL 中 DISTINCT 去重的核心注意事项详解
  • 【沉浸式解决问题】Mysql中union连接的子查询是否并行执行
  • Python训练营打卡Day50
  • 4 Studying《ARM System Developer’s Guide》9-15
  • 【时时三省】(C语言基础)关于变量的声明和定义
  • RAG轻松通-P1:分块
  • 游戏盾能够发挥哪些作用?
  • 文献阅读|基于PSMA PET/CT使用机器学习增强前列腺癌的诊断与风险评估
  • 期末作业swing水果店管理系统
  • 2.4 Python基础概念:通过一个文字冒险游戏学习编程
  • Linux网络-基础概念
  • Nginx代理缓存静态资源
  • 爬虫技术:数据获取的利器与伦理边界
  • 【CompletableFuture】常用方法(三)
  • 成品源码1688网站免费/凡科建站快车
  • 目前做网站的公司有哪些/西安百度推广开户
  • jsp网站开发登陆/手机百度如何发布广告
  • 建网站是怎么造成的/网页模板图片
  • 腾云网/快速排名优化怎么样
  • 网站建站的标准/关键词竞价排名是什么意思