Generator 通过 yield 将表单多步验证拆为可暂停/恢复的检查点,每步封装为纯函数,返回统一结构结果;支持同步校验与 Promise 异步校验结合,需外层状态机控制流程和 UI 更新。

Generator 可以把表单多步骤验证逻辑拆成可暂停、可恢复的“检查点”,让每一步校验独立执行、按需触发,避免嵌套回调或冗长 if-else。
用 yield 把校验步骤变成可中断的检查点
每个 yield 对应一个字段或一组字段的验证逻辑。Generator 函数返回迭代器,调用 next() 就执行到下一个 yield,返回当前校验结果(是否通过、错误信息等)。
- 把每步验证封装为纯函数(如
validateEmail(value)、validatePassword(value)),不直接操作 DOM 或发请求 - Generator 内部按顺序调用这些函数,失败时 yield 错误对象,成功则继续
- 外部控制流决定是否继续下一步(比如用户点击“下一步”才调 next)
配合状态机驱动 UI 流程
用一个简单状态机管理 Generator 的生命周期:初始化 → 运行中 → 暂停 → 完成/失败。每次用户操作(如点击按钮)触发 next(),根据返回值更新 UI(高亮错误、切换步骤、显示提示)。
- 迭代器首次调用
next()启动第一项校验;后续每次调用推进到下一 yield - 返回值结构建议统一:
{ done: false, value: { passed: true, field: 'email', message: '' } } - 若某步失败(
passed: false),不自动进入下一步,等待用户修正后再次触发 next
支持异步校验(如用户名唯一性)
Generator 本身不处理异步,但可以和 Promise 结合:用 yield 返回一个 Promise,外部用 await 等待结果后再调用 next(result) 把结果传回 Generator。
立即学习“Java免费学习笔记(深入)”;
- 例如:
yield checkUsernameAvailable(value),该函数返回 Promise - 外部捕获 Promise resolve/reject,再决定传
{ passed: true }还是{ passed: false, message: '已存在' }给 next() - 这样既保持 Generator 的线性表达力,又不阻塞主线程
实际使用时注意边界情况
Generator 不是银弹,需配合合理设计才能稳定工作。
- 不要在 yield 后直接修改共享状态(如全局表单数据),推荐把当前字段值作为参数传入校验函数
- 重置流程时,重新调用 Generator 函数获取新迭代器,不要复用旧的
- 跳步(如用户点击“上一步”)需自行维护步骤索引,Generator 本身不支持倒退
不复杂但容易忽略:Generator 提供的是“分步执行”的能力,真正的流程控制(何时 next、如何响应错误、怎么回退)还得靠外层代码来组织。它让验证逻辑更清晰,而不是替代状态管理。


















