Generator 迭代器生成函数

异步解决方案 内部封装多个状态 返回一个 iterator迭代器对象

function* Gen(a) {
    console.log("第一次 g.next()");
    yield "hello";
    console.log("第两次 g.next()");
    yield "world";
    console.log("第仨次 g.next()");
    return "!!!!!";
}
let g = Gen();

g.next();   
// 打印 "第一次 g.next()"
// 返回:{value: "hello", done: false}

g.next();   
// 打印 "第两次 g.next()"
// 返回:{value: "world", done: false}

g.next();   
// 打印 "第仨次 g.next()"
// 返回:{value: "!!!!!", done: true}

g.next();   
// 啥也不打印了
// 返回:{value: undefined, done: true}


Generator 迭代器生成函数 返回的是 iterator迭代器

function* Gen() {
    yield "first";  // 暂停标志
    yield "second";
    return "third";  // 不参与循环输出  但参与 g.next()
}
let g = Gen(); // 返回的是 iterator 迭代器

for(let v of g){
    console.log(v);
}
// first
// second

给对象 加 iterator 接口

let obj = {
    name:"yin",
    age:18,
};

// for(let v of obj){
//     console.log(v); // 报错:obj is not iterable
// }

// 给obj 添加 Symbol.iterator 属性 值为迭代器(可用 Generator迭代器生成函数 来创造迭代器)
obj[Symbol.iterator]=function*(){
    for(let key in obj){
        yield key;
    }
};

for(let k of obj){
    console.log(k);
}
// 此时 循环输出 name 、 age

yield 传参

function* Gen() {
    console.log("第一次next");
    let a = yield;  // yield 还可以传参
    console.log("第二次next a=>",a);
    let b = yield;
    console.log("第三次next b=>",b);
}

let g = Gen();
g.next();       // 第一次next
g.next("a");    // 第二次next a=> a
g.next("b");    // 第三次next b=> b
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容