generator 可使多步异步表单校验线性可控:每步 yield promise,配合执行器自动推进与错误捕获;闭包隔离状态,支持暂停、跳转、重试及结构化错误反馈。

Generator 可以让多步异步表单的校验流程变得线性、可控,避免嵌套回调或冗长的 async/await 链,尤其适合需要按序执行、中途可中断、状态可回溯的场景。
用 Generator 拆解校验步骤,每步 yield 一个 Promise
把每个表单步骤的校验逻辑封装成返回 Promise 的函数(如 validateStep1()、validateStep2()),在 Generator 函数中依次 yield 它们。Generator 不会立即执行,而是等待外部执行器驱动,天然适配“用户点击下一步 → 触发校验 → 成功则进,失败则停”的交互节奏。
- 每步校验失败时,
yield返回的 Promise 被 reject,执行器可捕获并中断流程 - 校验通过后,再调用
next(value)推进到下一步,同时把上一步数据传入后续逻辑 - 无需手动管理
currentStep索引,Generator 的执行位置本身就是“当前在哪一步”的状态
搭配自动执行器,统一处理 Promise 和错误
手写 gen.next() 太繁琐,需一个轻量执行器(如 runGenerator)递归调用 next(),并在 Promise resolve 后继续,reject 时抛出错误供 UI 层捕获显示。
- 执行器内部用
try/catch捕获 Generator 抛出的异常(比如校验失败 throw new Error('手机号格式错误')) - 支持向 Generator 内部传值(如
gen.next(formData)),实现“校验 → 收集数据 → 下一步”的闭环 - 错误信息可结构化返回(如
{ step: 2, field: 'email', message: '邮箱已注册' }),方便精准定位提示
与闭包协同,隔离表单状态和校验逻辑
Generator 本身不保存状态,但可以和闭包配合:工厂函数创建表单实例时,把 formData、errors 等私有变量封闭在作用域内,Generator 函数作为其内部方法被返回,共享这些变量。
- 校验函数(如
validateEmail())可直接读写闭包内的formData.email,无需参数传递 - 错误对象
errors在闭包中维护,Generator 中throw错误时,执行器可同步更新它并暴露给 UI - 避免全局污染,也规避了
async函数中频繁解构/合并formData的样板代码
支持中途暂停、重试与条件跳转
Generator 的暂停能力,让“跳过某步”“重新校验上一步”“根据前序结果动态决定下一步”变得自然。
- 例如第 2 步校验通过后,发现用户是 VIP,则
yield一个跳转逻辑,直接进入第 4 步 - 用户修改了已提交字段,可调用
gen.return()重置 Generator,并从对应步骤重新开始 - 网络请求失败时,执行器可自动重试该
yield表达式,不影响整体流程结构
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











