生成器函数天然适合实现轻量级状态机,通过yield暂停/恢复执行并隐式表达状态位置,next()传参驱动流转,配合调度器可统一处理错误、超时等边界。

生成器函数(Generator Function)天然适合实现轻量级状态机,因为它能暂停和恢复执行,并在每次 yield 处保存上下文。核心思路是:把每个状态封装为一个 yield 表达式,用 next() 触发状态切换,通过传入的参数决定后续走向。
用 yield 拆分状态节点
每个 yield 相当于一个状态出口,返回当前状态标识,同时等待外部输入来决定下一步。函数体内的逻辑就是状态内部行为。
- 状态不显式命名变量,而是靠执行位置隐式表达(即“走到哪,就在哪”)
- 避免在生成器里写复杂条件跳转,让控制权交还给调用方更清晰
- 例如:登录流程可拆为
promptUsername → validateUsername → promptPassword → login → done,每步一个yield
用 next(value) 驱动状态流转
调用 gen.next(input) 不仅恢复执行,input 还会成为上一个 yield 表达式的返回值,可用于判断分支。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一次
next()启动生成器,执行到第一个yield暂停,返回{ value: ..., done: false } - 后续
next(data)中的data会赋给前一个yield左侧的变量(如const user = yield 'USERNAME') - 根据
data值做 if/switch,决定下一次 yield 什么(即下一个状态)
配合外部调度器管理状态生命周期
生成器本身不维护状态名或跳转表,建议包一层调度器,统一处理错误、超时、重入等边界。
- 调度器持有生成器实例,每次收到事件就调用
next(eventPayload) - 检查返回值的
done字段,为true时表示状态机终结 - 可扩展支持
throw()注入异常,模拟状态被中断(如网络失败触发 ERROR 状态)
简单示例:交通灯状态机
// 红→绿→黄→红循环,支持手动干预(如检测到紧急车辆跳转到红)
function* trafficLight() {
let state = 'RED';
while (true) {
const cmd = yield state;
if (cmd === 'EMERGENCY') {
state = 'RED';
continue;
}
switch (state) {
case 'RED': state = 'GREEN'; break;
case 'GREEN': state = 'YELLOW'; break;
case 'YELLOW': state = 'RED'; break;
}
}
}
<p>const light = trafficLight();
console.log(light.next().value); // 'RED'
console.log(light.next().value); // 'GREEN'
console.log(light.next('EMERGENCY').value); // 'RED'
</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










