模拟迭代器next方法

模拟迭代器next方法
个人理解:首先感觉闭包的用处真是无处不在,而且下面三元运算用到一个点很巧妙,nextIndex++使用的是后++的方式,先使用值在运算叠加
function makeIterator(array){
  var nextIndex = 0;
  return {
    next(){
      return nextIndex < array.length ? {value:array[nextIndex++],done:false} : {value:undefined,done:true}
    }
  }
}
var it = makeIterator([1,2,3,4,5])
it.next()
it.next()
it.next()
注解:ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性,或者说一个数据结构只要具有Symbol.iterator属性,就可以认为是可遍历的.Symbol.iterator属性本身就是一个函数,就是当前数据结构默认的遍历器生成函数.执行这个函数,就会返回一个遍历器.至于属性名Symbol.iterator,它就是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为Symbol的特殊值,所以要放在方括号内.数据结构具有Symbol.iterator属性,执行这个属性,会返回一个遍历器对象.该对象的根本特征就是具有next方法.每次调用next方法,会返回一个代表当前成员的信息对象,具有value和done两个属性.
var arr = [1,2,3,4,5]
var iterator = arr[Symbol.iterator]()
iterator.next()
iterator.next()
iterator.next()

异步迭代器

function idMaker(array){
    let index = 0
    return {
        next(){
            return Promise.resolve(index < array.length ? {
                value:array[index++],
                done:false
            } : {
                value:undefined,
                done:true
            })
        }
    }
}
const it = idMaker([1,2,3,4,5])
it.next().then(res => console.log(res))
it.next().then(res => console.log(res))
it.next().then(res => console.log(res))
function idMaker(){
    let index = 0
    return {
        next(){
            return {
                value:new Promise(res => setTimeout(() => res(index++),1000)),
                done:false
            }
        }
    }
}
const it = idMaker()
it.next().value.then(res => console.log(res))
it.next().value.then(res => console.log(res))
it.next().value.then(res => console.log(res))
posted @ 2020-05-26 13:42  671_MrSix  阅读(394)  评论(0编辑  收藏  举报