async 和 await

2020-04-30  本文已影响0人  percykuang

async 和 await

async和await是ES2016新增的两个关键字,它们借鉴了ES2015中生成器在实际开发中的应用,目的是简化Promise API的使用,并非是替代Promise

async

async用于修饰函数,放置在函数最开始的位置,被修饰函数的返回结果一定是Promise对象

演示:

async function test() {
  console.log(1)
  return 2
}

等效于下面

function test() {
  return new Promise((resolve, reject) => {
    console.log(1)
    resolve(2)
  })
}

await

await关键字必须出现在async函数中

await用于某个表达式之前,如果表达式返回的是一个Promise对象,则得到的是thenable中的状态数据

示例:

async function test1() {
  console.log(1)
  return 2
}

async function test2() {
  const result = await test1()
  console.log(result) // 2

  // 上面两行代码相当于下面这么多行代码
  // return new Promise((resolve, reject) => {
  //   test1().then(data => {
  //     const result = data
  //     console.log(result)
  //     resolve()
  //   })
  // })
}

test2()

await后面如果不是一个Promise对象呢?

答案:使用Promise.resolve()直接包装

async function test() {
  const result = await 1
  console.log(result)
}
test()

等效于下面

function test() {
  return new Promise((resolve, reject) => {
    Promise.resolve(1).then(data => {
      const result = data
      console.log(result)
      resolve()
    })
  })
}

async和await如何处理错误情况呢?

答案:使用try catch

async function getPromise() {
  if (Math.random() < 0.5) {
    return 1
  } else {
    throw 2
  }
}

async function test() {
  try {
    const result = await getPromise()
    console.log('正常状态', result)
  } catch(error) {
    console.log('错误状态', error)
  }
}
上一篇下一篇

猜你喜欢

热点阅读