generator 不是高阶函数但天然适配其模式,通过yield描述算子、执行器分发处理、暂停点映射画布节点,实现声明式编排与调试回溯。

Generator 本身不是“高阶函数”,但它天然适配高阶函数模式——通过接受异步操作描述、产出执行步骤、交由外部调度器驱动,恰好契合低代码引擎中可视化算子的声明式编排需求。关键不在于把 Generator 当作黑盒封装,而在于将其作为可暂停的执行契约,让每个算子节点对应一个 yield 表达式,从而在画布上实现“拖拽即流程,连线即依赖”的逐级级联。
将算子抽象为 yieldable 单元
每个可视化算子(如“HTTP 请求”“数据过滤”“条件分支”)不应直接执行逻辑,而是返回一个可被 Generator 暂停识别的描述对象。该对象需包含:类型标识、配置参数、错误处理策略及一个 resolve 回调占位符。
- 例如:
yield { type: 'http', url: '/api/user', method: 'GET' } - 引擎运行时捕获该对象,触发真实请求,待响应后调用
next(result)将数据注入下一阶段 - 这样,画布连线关系就自然映射为 yield 序列顺序,无需手动维护 Promise 链或状态机
用自动执行器桥接可视化与执行流
低代码引擎需内置轻量级执行器(非第三方库),它接收 Generator 实例,监听每个 yield 的产出,并按类型分发到对应算子处理器:
- 遇到
{ type: 'delay', ms: 1000 }→ 启动定时器,超时后调用next() - 遇到
{ type: 'condition', test: (data) => data.code === 0 }→ 执行判断,根据布尔结果跳转至不同分支 Generator(支持 yield* 委托) - 所有异常统一由 Generator 内部 try/catch 捕获,再通过
throw()推送至对应错误算子节点
支持双向数据绑定与调试回溯
Generator 的暂停点天然对应画布上的节点高亮态;每次 next() 调用都可记录输入/输出快照,形成执行轨迹。
- 用户点击任一节点,引擎可还原该 yield 执行前的上下文变量、传入参数、以及上一节点输出值
- 修改某节点配置后,无需重跑全程——只需从该节点重新
next(),后续 yield 自动延续原状态 - 这比基于 Promise 的不可逆链式执行更利于低代码场景下的实时调试与迭代
避免常见陷阱:不裸写异步,不暴露 next 控制权
最终用户永远不接触 function* 或 next()。所有 Generator 逻辑由引擎模板生成:
- 画布保存的是 JSON 描述(如
[{"id":"a","type":"http"}, {"id":"b","type":"filter"}]),引擎将其编译为标准 Generator 函数字符串,动态eval或new Function构建实例(注意沙箱隔离) - 禁止用户在算子脚本区直接写
yield—— 这会破坏可视化约束;允许的仅是配置表达式(如$.data.name)或简单同步函数 - 所有异步副作用必须经引擎统一拦截,确保 yield 不产出 Promise,只产出纯描述对象,防止执行器逻辑泄漏











