generator 本身不直接加载配置文件,而是通过控制加载时机和流程实现“按需触发、动态加载”,将 fetch 等异步操作包装为可暂停步骤,配合 promise 驱动实现分步加载与顺序依赖。

Generator 本身不直接加载配置文件,但它能很好地配合异步操作,实现“按需触发、动态加载”的逻辑。核心思路是:用 Generator 控制加载时机和流程,把配置读取(如 fetch 或 fs.readFile)包装成可暂停的异步步骤,每次调用 next() 时才真正发起请求或读取文件。
用 Generator 封装配置加载步骤
Generator 函数返回一个迭代器,你可以让它在每个 yield 处暂停,等配置加载完成再继续。比如定义一个生成器,每 yield 一次就加载一个模块的配置:
- 每个
yield对应一个配置项路径(如"api/config.json"),不直接执行加载,只提供“待加载描述” - 外部调用者决定何时
next(),并传入实际加载结果(例如通过fetch().then(...)解析后的对象) - 这样就把“加载时机”从函数内部释放出来,由业务逻辑控制——真正实现“按需”
配合 Promise 实现异步加载驱动
Generator 不支持原生 await,但可以手动用 Promise 驱动它。常见做法是写一个 runGenerator 辅助函数:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 调用
gen.next(value)获取下一个{ value, done } - 如果
value是 Promise(比如fetch(url).then(r => r.json())),就.then(res => runGenerator(gen, res))继续 - 这样整个流程变成:触发 → 暂停 → 加载 → 恢复 → 再暂停 → 再加载……
实际示例:分模块加载配置
假设项目有 user、theme、feature 三类配置,各自独立文件。你可以这样组织:
function* configLoader() {
const user = yield fetch('/config/user.json').then(r => r.json());
const theme = yield fetch('/config/theme.json').then(r => r.json());
const feature = yield fetch('/config/feature.json').then(r => r.json());
return { user, theme, feature };
}
然后用一个 runner 执行它(注意:这不是标准语法,需自行封装 Promise 驱动逻辑)。关键点在于:直到你调用 next(),fetch 才真正发出;前一个配置没加载完,后续不会执行——天然支持按需与顺序依赖。
注意事项与替代建议
Generator 方案适合需要精细控制加载节奏的场景(如配置间有依赖、或需用户交互后才加载某项),但现代开发中更常用 async/await + 动态 import():
-
import('./config/user.js')本身就是按需、异步、可缓存的,语义更清晰 - 若需“暂停/恢复”能力(比如加载中途取消),可用
AbortController配合fetch,比 Generator 更直观 - Generator 在配置加载这类线性流程中略显冗余,更适合复杂状态机或协程式任务编排
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










