Generator 双向通道:.return() 与 .throw() 在流控制中的高阶应用
超越简单的 yield 迭代,利用 Generator.prototype.return 和 .throw 实现外部注入的终止/异常信号,构建一个可暂停、可恢复、可清理的资源管理器。 · 难度:入门 · +10XP
Generator 双向通道:.return() 与 .throw() 在流控制中的高阶应用
Generator 函数不仅可以通过 yield 向外发送值,还可以通过 next(val) 向内注入值。但很少人使用 .return() 和 .throw() 方法——它们允许外部强制终止生成器或注入异常。本教程将设计一个 ResourceManager 生成器,它管理文件句柄或连接池,当调用 .return() 时自动执行清理逻辑(finally 块),而 .throw() 可用于模拟外部中断(如用户取消)。我们还将实现一个“双向 RPC”风格,生成器内部 yield 一个问题,外部通过 next(answer) 回答,形成对话式流程。
function* resourceManager() {
try {
const resource = { id: 1 };
console.log('资源已分配');
const command = yield resource;
if (command === 'close') {
console.log('外部要求关闭');
return 'cleaned';
}
} finally {
console.log('清理资源');
}
}
const gen = resourceManager();
gen.next(); // 分配资源
const result = gen.return('外部终止'); // 触发 finally
console.log(result.value); // 'cleaned'