Generator 本身不是高阶函数,但可被高阶函数封装驱动,实现低代码大屏中图表组件的按步热装载:通过工厂函数生成预置参数的 Generator 实例,由调度器按需调用 next 推进 fetch→校验→渲染流程,支持暂停、终止、错误注入与状态映射。

Generator 本身不是高阶函数,但能被高阶函数封装和驱动——在低代码大屏系统中,真正起作用的是“用高阶函数包装 Generator”,从而实现图表组件的按步热装载。核心思路是:把每个图表的加载(请求、渲染、错误重试)抽象为一个可暂停、可恢复、可传参的执行单元,再由统一调度器按需触发 next,而非一次性全量加载。
用高阶函数封装 Generator 加载逻辑
不直接暴露 function* 给低代码配置层,而是提供一个工厂函数,接收图表配置(如 API 地址、超时、重试策略),返回一个已预置参数的 Generator 实例:
- 工厂函数接受 config 对象,内部闭包保存上下文(如 token、theme、缓存 key)
- Generator 主体只关注三件事:拉数据 → 校验 → 渲染;每一步 yield 一个带语义的动作对象(如
{ type: 'fetch', url: '/api/chart1' }) - 外部调度器识别 type 后执行对应副作用(发请求、更新 DOM、打日志),再调用
next(result)推进下一步
支持热装载的关键控制点
所谓“热装载”,指组件在运行时动态插入、卸载、刷新,而不影响其他图表。Generator 的天然暂停能力正好匹配这一需求:
- 每个图表实例拥有独立 Generator 迭代器,
iterator.return()可主动终止未完成流程(如切换 tab 时清理 pending 请求) - yield 返回的 action 对象含唯一
id和phase字段,便于低代码平台做状态映射(例如:phase === 'rendering'时显示骨架屏) - 利用
iterator.throw(err)在任意阶段注入错误,触发平台级错误兜底(如降级为静态图、上报监控)
与低代码配置层对齐的设计
低代码大屏通常通过 JSON Schema 配置组件行为。Generator 驱动链需适配这种声明式风格:
- 配置项中声明
"loadStrategy": "stepwise",平台自动选用 Generator 调度器而非 Promise.all - 每个图表配置可带
onBeforeStep/onAfterStep钩子函数(即高阶函数的入参),用于注入权限校验、埋点或主题适配逻辑 - 调度器将 yield 值序列化为标准中间态(如
{ status: 'loading', progress: 33 }),供可视化编辑器实时预览加载过程
避免常见陷阱
实际落地时容易忽略 Generator 的惰性本质和生命周期管理:
- Generator 不会自动执行异步操作——必须由调度器显式调用
next()才推进;切勿在yield fetch(...)中直接执行请求,而应 yield 一个待执行描述对象 - 不要复用同一个 Generator 实例多次调用
next();每次热装载都应新建迭代器,否则 done 为 true 后再调用会返回{ value: undefined, done: true } - 浏览器标签页失焦时,建议暂停所有非关键图表的 Generator(调用
iterator.return()),重新聚焦后再 resume(需记录最后 yield 位置)

















