// 定义Generator函数
function* simpleGenerator() {
debugger;
console.log('开始执行');
debugger;
yield '第一次暂停';
debugger;
console.log('恢复执行');
debugger;
yield '第二次暂停';
debugger;
console.log('结束执行');
debugger;
return '最终结果';
}
// 创建Generator对象
const gen = simpleGenerator();
debugger;;
// 逐步执行
console.log(gen.next()); // { value: "第一次暂停", done: false }
debugger;;
console.log(gen.next()); // { value: "第二次暂停", done: false }
debugger;;
console.log(gen.next()); // { value: "最终结果", done: true }
debugger;;
function* counterGenerator() {
debugger
let count = 0;
debugger
while (true) {
debugger
yield count++;
debugger
}
}
debugger
const counter = counterGenerator();
debugger
console.log(counter.next().value); // 0
debugger
console.log(counter.next().value); // 1
debugger
console.log(counter.next().value); // 2
debugger
function* interactiveGenerator() {
debugger
const name = yield '请输入你的名字';
debugger
const age = yield `你好${name},请输入你的年龄`;
debugger
return `${name}的年龄是${age}`;
}
debugger
const gen = interactiveGenerator();
debugger
console.log(gen.next()); // { value: "请输入你的名字", done: false }
debugger
console.log(gen.next('张三')); // { value: "你好张三,请输入你的年龄", done: false }
debugger
console.log(gen.next(25)); // { value: "张三的年龄是25", done: true }
debugger
// 模拟异步递增
function asyncIncrement(num, delay) {
debugger
return new Promise(resolve => {
debugger
setTimeout(() => {
debugger
resolve(num + 1)
debugger
}, delay);
debugger
});
}
// Generator实现计数器
function* counter() {
debugger
let count = 0;
debugger
console.log('开始计数');
debugger
count = yield asyncIncrement(count, 1000);
debugger
console.log('计数:', count);
debugger
count = yield asyncIncrement(count, 1500);
debugger
console.log('计数:', count);
debugger
count = yield asyncIncrement(count, 800);
debugger
console.log('最终计数:', count);
debugger
return count;
}
// 简化版执行器
function run(genFn) {
debugger
const iterator = genFn();
debugger
function step(value) {
debugger
const result = iterator.next(value);
debugger
if (!result.done) {
debugger
return result.value.then(step);
}
debugger
return Promise.resolve(result.value);
}
debugger
return step();
}
debugger;;
// 执行计数器
run(counter).then(finalCount => {
console.log('计数器停止于:', finalCount);
});