js yield Generator

 

 

 

 

// 定义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);
});

 

posted @ 2025-11-20 15:11  AngDH  阅读(2)  评论(0)    收藏  举报