# Demo 编码约束 所有 demo 必须严格遵守以下约束。违反任一条视为不合格。 ## API 签名(当前代码版本) - `statusDispatcher: (peek, status) => status` — 第二参数是状态名字符串,不是 state 快照 - `handler: (state, peek, api)` — state = `{ status, resultData }`(2 字段快照) - `api.switchStatus(nextStatus, effect?)` - `api.writeResultData(value)` — 每轮 ≤1 - `api.writeExtra(value)` — 每轮 ≤1 - `api.createChildStateStack(def, id)` — 创建子栈 - `api.childStateStack(id)` — 获取子栈句柄:`{ readState, push, destroy }` - `ss.run()` — 启动循环 - `ss.readState()` — 返回 `{ status, resultData }` - `ss.push(data)` — 外部入栈 - `createStateStack(def, runParent?)` — 第二个参数是 runParent 回调 ## Effect - `{ effect: 'push', param: [a, b, c] }` — param 数组会被解包为 `push(a, b, c)` - `{ effect: 'pop' }` — 弹栈,pop 定义中可调用 `writeResultData` - `{ effect: 'run' }` — 控制权转移给 runParent,循环 break - `{ effect: 'run', param: ['child', id] }` — 运行子栈 ## 硬性禁止 1. **禁止 `switchStatus(null, ...)`** — 永远不要传 null 作为第一个参数 2. 终止/结束流程必须用具体状态名 + `{ effect: 'run' }`,由 runParent 处理后续 3. `statusDispatcher` 必须用 `(peek, status)` 签名,返回 `status` 或基于 peek 推导的状态名 4. `init` 在 createStateStack() 调用时立即执行,不在 run() 时执行 ## import 路径 ```js import { createStateStack, refineCreateStateStack } from '../../src/createStateStack.js'; ``` ## 文件结构 每个 demo 文件夹内自由创建任意文件名和目录结构。只需保证入口可运行即可。