当前位置: 首页 > 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();

感谢你的阅读

http://www.dtcms.com/a/253056.html

相关文章:

  • 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】常用方法(三)
  • JetsonNano详细使用笔记(二)
  • CentOS 7 虚拟机网络配置异常 典型问题:启动了NetworkManager但是network无法启动
  • 家用旧电脑搭建小型服务器操作步骤教程:一步一步本地部署到公网访问
  • 升级OpenSSL和OpenSSH 修复漏洞
  • InputStream重复读取导致文件损坏问题解决方案
  • 【C分解多位整数输出1位数2各位空格最后无空格3倒序/读取指定字符否则退出】2022-6-29
  • Flask设计网页截屏远程电脑桌面及切换运行程序界面
  • Javaweb学习——day6(JDBC入门 CRUD)
  • 【Unity】MiniGame编辑器小游戏(三)马赛克【Mosaic】
  • EPOLL相关接口和原理