6-1 异步迭代:for await of

20 阅读1分钟

同步迭代 Symbol.iterator

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)
}

我希望当前迭代执行完之后再去执行下一个,使用到属性Symbol.asyncIterator

function getPromise(time) {
  return new Promise((resolve, reject) => {
    setTimeout(()=>{
      resolve({
        value: time,
        done: false
      })
    }, time)
  })
}
const arr = [getPromise(1000), getPromise(2000),getPromise(3000),]
arr[Symbol.asyncIterator] = function(){
  let nextIndex = 0
  return {
    next(){
      return nextIndex < arr.length ? arr[nextIndex++]:Promise.resolve({
        value: undefined,
        done: true
      })
    }
  }
}
//for await of 等待promise 对象变成resolve 之后,再去执行下一个
一个异步执行操作完成之后再去取下一个异步操作
async function test(){
  for await (let item of arr) {
    console.log(item)
  }
}
test()