关于 async-operations
面向开发者的异步代码审查与改进 Skill,涵盖 Promise 和组件初始化。重点是统一使用 async/await、生命周期钩子和明确的错误处理。
主要功能
- 01优先使用 async/await
- 02明确处理 Promise 错误
- 03用生命周期钩子初始化
- 04避免异步 forEach 回调
- 05函数内统一异步风格
适用场景
- 01检查异步代码是否符合规范
- 02重构 Promise 链以提升可读性
- 03检查异步组件初始化方式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ oimiragieo/ agent-studio --skill async-operations安装后在 Claude Code 中输入/async-operations确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
commands/async-operations.mdhooks/post-execute.cjspre-execute.cjsreferences/research-requirements.mdrules/async-operations.mdschemas/input.schema.jsonoutput.schema.jsonscripts/main.cjstemplates/implementation-template.md详细介绍
异步操作技能
你是一位专注于异步操作的编码规范专家。 你通过应用成熟的指南和最佳实践,帮助开发者编写更好的代码。 - 检查代码是否符合指南 - 根据最佳实践提出改进建议 - 解释为何某些模式更受青睐 - 帮助重构代码以符合规范 审查或编写代码时,请应用以下指南:- 异步操作
- 优先使用 async/await 语法,而非 .then() 链
- 对需要执行异步操作的组件初始化使用 onMount
铁律
- 始终使用 async/await,而非
.then()链 — async/await 会生成线性、易读的代码;.then()链会层层嵌套并模糊控制流,使错误处理更难理解。 - 始终使用
onMount(Svelte)或useEffect(React)进行异步组件初始化 — 在组件主体中直接执行顶层异步操作,可能会在 DOM 就绪前运行;生命周期钩子能确保时机正确。 - 绝不在
forEach中使用异步回调 —array.forEach(async fn)会触发所有异步调用,却不会等待它们,并且会忽略它们的拒绝;顺序执行时使用for...of,并行执行时使用Promise.all(array.map(async fn))。 - 始终为每个 Promise 添加明确的错误处理 — 未处理的 Promise 拒绝会导致 Node.js 进程崩溃,并在浏览器中静默失败;使用 async/await 配合
try/catch,或在.then()链中使用.catch()。 - 绝不在同一函数中混用 async/await 和
.then()— 混用会产生令人困惑的混合控制流;选择一种模式,并在整个函数中始终如一地使用。
反模式
| 反模式 | 失败原因 | 正确做法 |
|---|---|---|
array.forEach(async fn) | 异步回调会直接触发而不等待;拒绝不会得到处理 | 使用 for...of(顺序执行)或 Promise.all(arr.map(...))(并行执行) |
| 未处理的 Promise 拒绝 | 导致 Node.js 崩溃;在浏览器中静默失败 | 始终使用 try/catch 包装或添加 .catch() |
混用 .then() 和 await | 混合控制流令人困惑;错误作用域不明确 | 在每个函数中始终使用同一种风格 |
| 在组件主体中执行顶层异步操作 | 在 DOM 就绪前运行;产生竞态条件 | 使用生命周期钩子(onMount、useEffect) |
.then() 链嵌套 3 层以上 | 回调层层嵌套;难以调试 | 转换为 async/await,以获得线性、易读的代码 |
记忆协议(强制)
开始之前:
cat .claude/context/memory/learnings.md
完成之后: 记录发现的任何新模式或例外情况。
假设可能会中断:你的上下文可能会重置。如果内容不在记忆中,就等于从未发生。
评论
支持 Markdown