关于 effect-ts-resources
面向 Effect-TS 开发者的资源生命周期管理技能,使用 Scope 和 acquireRelease 确保资源在失败或中断时也能清理。
主要功能
- 01使用 acquireRelease 确保释放
- 02管理作用域内的资源生命周期
- 03按 LIFO 顺序清理资源
- 04向 Scope 添加终结器
适用场景
- 01管理数据库连接
- 02打开并关闭文件
- 03启动服务器或获取锁
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mrevanzak/ effect-ts-skills --skill effect-ts-resources安装后在 Claude Code 中输入/effect-ts-resources确认已加载。
详细介绍
Effect-TS 资源管理
概述
使用 Scope 和 acquireRelease 管理资源生命周期,确保资源得到清理。无论程序失败、抛出异常还是被中断,都会执行清理。
适用场景
- 症状:资源泄漏(连接挂起)、手动编写
try/finally代码块、清理逻辑复杂。 - 触发条件:打开文件、连接数据库、启动服务、获取锁。
- 不适用场景:简单的数据转换,或无需显式关闭或释放的值。
核心模式
在 Effect 中,手动使用 try/finally 容易出错,因为它会绕过中断处理。
| 反模式(手动) | Effect 模式(安全) |
|---|---|
try { conn.open() } finally { conn.close() } | Effect.acquireRelease(open, close) |
快速参考
| 函数 | 用途 |
|---|---|
Effect.acquireRelease | 定义获取资源以及确保资源释放的逻辑。 |
Effect.scoped | 创建一个边界,释放作用域内的所有资源。 |
Effect.addFinalizer | 向当前作用域添加清理操作。 |
实现
1. acquireRelease 模式
确保即使发生失败或中断,也会执行清理。
import { Effect } from 'effect';
const withDatabaseConnection = Effect.acquireRelease(
Effect.tryPromise(() => pool.connect()), // Acquire
(connection) => Effect.sync(() => connection.release()) // Release
);
const program = Effect.gen(function* () {
const conn = yield* withDatabaseConnection;
return yield* conn.query('SELECT * FROM users');
});
2. 作用域内的资源
多个资源共用同一个生命周期边界。资源按 LIFO(后进先出)顺序释放。
import { Effect, Scope } from 'effect';
const program = Effect.scoped(
Effect.gen(function* () {
const db = yield* managedConnection;
const cache = yield* managedCache;
// Both cleaned up when scope closes (cache first, then db)
return yield* doWork(db, cache);
})
);
3. 文件处理
const withFile = (path: string) => Effect.acquireRelease(
Effect.tryPromise(() => fs.open(path, 'r')),
(handle) => Effect.promise(() => handle.close())
);
常见错误
- 使用
try/finally:绕过 Effect 的中断模型。请使用acquireRelease。 - 忘记使用
Effect.scoped:直到父作用域关闭(通常是应用结束)后,资源才会释放。 - 顺序错误:资源按获取顺序的相反顺序释放。请确保先获取依赖项。
**必备背景知识:**使用 effect-ts-fundamentals 了解核心生成器模式。
评论
支持 Markdown