const arr = ["es6","es7","es8","es9"]
arr[Symbol.iterator] = function(){
  let nextIndex = 0
  return {
    next(){
      return nextIndex < arr.length ? {
        value:arr[nextIndex++],
        done:false
      }:{
        value:undefined,
        done:true
      }
    }
  }
}
for(let item of arr){
  console.log(item) // es6 es7 es8 es9
}
二、异步迭代器
1、普通for...of...循环异步
function getPromise(time){
  return new Promise((resolve,reject) => {
    setTimeout(() => {
      resolve(time)
    })
  },time)
}
const arr = [getPromise(1000),getPromise(2000),getPromise(3000)]
for(let item of arr){
  console.log(item) // Promise{pending} Promise{pending} Promise{pending}
}
2、异步循环:使用关键字asyncIterator
function getPromise(time){
  return new Promise((resolve,reject) => {
    setTimeout(() => {
      resolve(time)
    })
  },time)
}
const arr = [getPromise(1000),getPromise(2000),getPromise(3000)]
for(let item of arr){
  console.log(item) // Promise{pending} Promise{pending} Promise{pending}
}
function getPromise(time){
  return new Promise((resolve,reject) => {
    setTimeout(() => {
      resolve({
        value:time,
        done:false
      })
    })
  },time)
}
const arr = [getPromise(1000),getPromise(2000),getPromise(3000)]
arr[asyncIterator] = function(){
  let nextIndex = 0
  return {
    next(){
      return nextIndex < arr.length ? arr[nextIndex++]:Promise.resolve({ // 相当于Promise的静态方法,返回成功状态的Promise对象
        value:undefined,
        done:true
      })
    }
  }
}
for(let item of arr){
  console.log(item) // Promise{pending} Promise{pending} Promise{pending}
}
// 等到上一次异步执行成功之后再进行下一个异步操作
async function test(){
  for await (let item of arr){
    console.log(item)
  }
}
test()  // 1000 2000 3000










