美文网首页
ES9(一) —— For await of

ES9(一) —— For await of

作者: 顽皮的雪狐七七 | 来源:发表于2020-11-06 15:53 被阅读0次

目录

  • 问es9中异步操作集合是如何遍历的?
  • 如何可以解决这种问题?
  • 最终的解决方式-for-await-of
  • for-of和for-await-of的区别
  • 自定义数据结构的异步遍历如何实现?
  • ES6-ES10学习版图

问:ES9中异步操作集合是如何遍历的?

数组中的元素都是promise对象,那么是没有办法遍历的。

function Gen(time) {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      resolve(time)
    },time)
  })
}

function test() {
  let arr = [Gen(2000), Gen(1000), Gen(3000)]
  for(let item of arr) {
    console.log(Date.now(), item.then(console.log))
  }
}

test()
// 1597047404040 Promise {<pending>}
// 1597047404040 Promise {<pending>}
// 1597047404040 Promise {<pending>}
// 1000
// 2000
// 3000

这种遍历就是不管三七二十一,首先遍历出来,然后挂起的promise再执行。

如何可以解决这种问题?

将test函数前面添加async,并在for-of遍历的时候给每个元素前面添加await,每个对象等待结束之后再执行下一个。

function Gen(time) {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      resolve(time)
    },time)
  })
}

async function test() {
  let arr = [Gen(2000), Gen(1000), Gen(3000)]
  for(let item of arr) {
    console.log(Date.now(), await item.then(console.log))
  }
}

test()

// 2000
// 1597047766221 undefined
// 1000
// 1597047768223 undefined
// 3000
// 1597047768224 undefined

分析输出结果:先执行了await后面的then,返回2000之后
执行console.log返回时间戳
然后await的返回值是空,所以返回undefined
虽然因为awaitfor-of暂停了,但是执行的顺序和我们想要的还是不一样

最终的解决方式 —— For await of

test函数前面还要添加async关键字,对for-of进行改进

function Gen(time) {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      resolve(time)
    },time)
  })
}

async function test() {
  let arr = [Gen(2000), Gen(100), Gen(3000)]
  for await(let item of arr) {
    console.log(Date.now(), item)
  }
}

test()

// 1597048677429 2000
// 1597048677429 100
// 1597048678429 3000

for-of和for await of的区别

for-of是用来遍历同步操作的
for-of里面用await,如果有其他操作,也会有输出顺序错误
for await of 是可以对异步集合进行操作

自定义数据结构的异步遍历如何实现?

  • 定义一个对象,里面有基础数据类型,还有promise类型
  • 自定义一个[Symbol.asyncIterator]方法让其变成可遍历的对象
  • 使用for await of方法进行遍历
const obj = {
  count: 0,
  Gen(time) {
    return new Promise((resolve, reject) => {
      setTimeout(function () {
        resolve({ done: false, value:time })
      }, time)
    })
  },
  [Symbol.asyncIterator] () {
    let self = this
    return {
      next() {
        self.count++
        if(self.count < 4) {
          return self.Gen(Math.random() * 1000) //retuen的返回值是Gen函数的resolve返回的对象
        }else{
          return Promise.resolve({
            done: true,
            value: ''
          })
        }
      }
    }
  }
}

async function test () {
  for await (let item of obj) {
    console.log(Date.now(), item)
  }
}

test()

// 1597049702437 292.73328473812523
// 1597049702574 136.72074104961163
// 1597049703250 675.518962144079

ES6-ES10学习版图

ES6-10.png

相关文章

  • ES9已经来了 Are you ready?

    ES9 前言 改篇文章主要是介绍了ES9新加的一些新特性。 1. 异步迭代 在async/await的某些时刻,你...

  • ES9(一) —— For await of

    目录 问es9中异步操作集合是如何遍历的? 如何可以解决这种问题? 最终的解决方式-for-await-of fo...

  • 复习:ES6~ES12的一些新特性归纳(ES9、ES10)

    ES9相关的特性(2018) 异步迭代: await可以和for.....of..循环配合使用,以串行的方式运行异...

  • ES9 ES10 更新点梳理

    接着上文我们再来看看 ES8、9 的新特性,小白慢慢成长中... ES9 异步迭代器 for await...of...

  • 关于ES9中 for await of ... 异步迭代器

    今天在逛知乎时看到了一个ES9的异步迭代器for await of ...,于是就随便写写来测试了一下效果,以下是...

  • async和await

    浅谈Async/Await用 async/await 来处理异步 async和await async:声明一个异步...

  • 小程序-云开发

    async和await async:异步(无等待)await:等待(是为了同步) 一、await 关键字只在 as...

  • 学习asyncio

    关键字await将控制权移交给event loop。 一、await关键字 二、async和await的语法 三、...

  • JS 中的 async/await

    async/await 是什么? async/await 是 ES2017 中新增的异步解决方案; await 只...

  • vue for 循环中使用 await

    vue for 循环中使用 await(转) await 和 async必须成对出现,如果调用await的地方,无...

网友评论

      本文标题:ES9(一) —— For await of

      本文链接:https://www.haomeiwen.com/subject/jxeavktx.html