Learn async/await

JavaScript的异步处理方案由最初让人头疼的callback hell,到ES6加入了抽象异步处理对象的Promise,在思想上已经有了质的飞跃,后来出现的Generator Function改成了趋向于同步的写法,使用yield标记异步操作中需要暂停的地方,通过next()移动指针等等,但这样做语义不太直观,到最后终于出现了一种被称为终极解决方案的方案,加入了ES7中,它就是async/await。

async/await本质上是在操作Promise,所以还是异步

const sleep = time =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('ok')
    }, time)
  })

async function start() {
  let result = await sleep(3000)
  console.log(result)
}

start()
​
// async函数返回一个Promise对象
start()
  .then(() => {
    console.log('hello')
  })

await后面的Promise对象,如果需要捕捉异常(运行结果是rejected)有如下两种写法:

const sleep = time =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      reject('error')
    }, time)
  })

// .catch 捕捉
async function start() {
  let result = await sleep(3000).catch(err => {
    console.error(err)
  })
}

// try/catch 语句
async function start() {
  try {
    let result = await sleep(3000)
    console.log(result)
  } catch (err) {
    console.error(err)
  }
}

异步循环

async function start() {
  for (let i = 0; i < 5; i++) {
    console.log(i)
    await sleep(1000)
  }
}

注意,await 只能在 async 函数中,如果用在普通函数(如forEach)中会报错。

如果需要多个请求并发执行,可以使用Promise.all(),用法详见上一篇文章。

async function concurrency() {
  await Promise.all(promises)
}

此外,有一篇文章介绍了一些错误处理和动态运算的解决方案,可以学习一下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本...
    呼呼哥阅读 12,047评论 5 22
  • 相对于回调函数来说,Promise是一种相对优雅的选择。那么有没有更好的方案呢?答案就是async/await。优...
    松哥888阅读 47,786评论 8 36
  • 简单介绍下这几个的关系为方便起见 用以下代码为例简单介绍下这几个东西的关系, async 在函数声明前使用asyn...
    _我和你一样阅读 21,430评论 1 24
  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 7,708评论 0 5
  • 国庆八天就是起床吃饭打游戏看剧,看不下打游戏手麻休息一下接着打,反省觉着这样太浪费时间不如写作画画雕刻,但是下一秒...
    阿诺蓝阅读 1,427评论 0 0

友情链接更多精彩内容