Iterrator与Generator

    技术2022-07-10  101

    文章目录

    Iterrator什么是Iterrator接口工作原理Iterrator的基本用法给对象添加Interator接口 Generator基本概念yield 与 nextGenerator 函数用法

    Iterrator

    什么是Iterrator接口

    Symbol.iterator属性本身是一个函数可以为各种不同的数据结构提供统一的访问机制该接口主要供for…of来进行使用,即可以使用for…of进行遍历的就会具有Iterrator接口

    工作原理

    Iterator的遍历过程是这样的:

    创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。不断调用指针对象的next方法,直到它指向数据结构的结束位置。 每一次调用next方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含value和done两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。

    Iterrator的基本用法

    { let arr = ['hello', 'world']; let map = arr[Symbol.iterator](); console.log(map.next()); console.log(map.next()); console.log(map.next()); } { let arr = ['hello', 'world']; // array拥有了iterator接口,可以使用for...of for (let value of arr){ console.log(value); } }

    给对象添加Interator接口

    let obj = { name: "XX", age: 20, job: 'teacher', [Symbol.iterator](){ const _this = this; const keys = Object.keys(_this) let index = 0; return { next(){ if (index < keys.length){ return { value: _this[keys[index++]], done: false } }else { return { value: undefined, done: true } } } } } } for(let key of obj){ console.log(key); }

    Generator

    基本概念

    generator其特点是可以中断函数的执行,我们需要在暂停的地方使用yield语句标明;不同普通函数的返回, 执行 Generator函数返回一个遍历器对象(一个指向内部状态的指针对象)调用遍历器对象的next方法,使得指针移向下一个状态。每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield表达式(或return语句)为止

    yield 与 next

    yield关键字让 Generator内部的逻辑能够切割成多个部分每次调用 next方法,会返回一个对象,表示当前阶段的信息( value 属性和 done属性)。value 属性是 yield语句后面表达式的值,表示当前阶段的值;done属性是一个布尔值,表示 Generator 函数是否执行完毕,即是否还有下一个阶段。 { let tell = function* (){ yield 'a'; yield 'b'; return 'c'; } let k = tell(); console.log(k.next()); //{value: "a", done: false} console.log(k.next()); //{value: "b", done: false} console.log(k.next()); //{value: "c", done: true} console.log(k.next()); //{value: undefined, done: true} }

    Generator 函数用法

    下面是使用Generator函数实现的一个长轮询 { // 长轮询 let ajax = function* (){ yield new Promise((resolve, reject) => { setTimeout(() => { resolve({code:0}); }, 200); }) } let pull = function(){ let generator = ajax(); // 执行函数,返回遍历器对象 let step = generator.next(); // 执行next函数,返回一个对象,{value: Promise, done: false} step.value.then(d => { // 执行promise中的then方法,获取异步操作返回的数据 if (d.code !== 0){ // 如果code不为0,那么在1S后继续请求,直到code为0 setTimeout(() => { console.info('wait'); pull(); }, 1000); }else { console.log(d); } }) } pull(); }

    文章参考: JS的ES6的iterator JS为对象添加Iterator接口 Generator 函数的含义与用法 js异步编程之Generator

    Processed: 0.011, SQL: 9