async/await 和 promise 异同和使用(学习记录)

221 阅读1分钟
async/await 和 promise 异同和使用(学习记录)

promise解决了回调地域,多个函数嵌套调用

异步函数是 promise 和生成器的组合,基本上,它们是 promise 的更高级别的抽象。 而 async/await 建立在 promise 之上。

为什么在使用 promise 的时候引入 async/await

它们减少了 promises 的样板,且减少了 promise 链的“不破坏链条”的限制。

// 链式调用
const getFirstUserData = () => {
  return fetch('/users.json') // 获取用户列表
    .then(response => response.json()) // 解析 JSON
    .then(users => users[0]) // 选择第一个用户
    .then(user => fetch(`/users/${user.name}`)) // 获取用户数据
    .then(userResponse => userResponse.json()) // 解析 JSON
}

getFirstUserData()

使用 await/async 提供的相同功能:

const getFirstUserData = async () => {
  const response = await fetch('/users.json') // 获取用户列表
  const users = await response.json() // 解析 JSON
  const user = users[0] // 选择第一个用户
  const userResponse = await fetch(`/users/${user.name}`) // 获取用户数据
  const userData = await userResponse.json() // 解析 JSON
  return userData
}

getFirstUserData()

多个异步函数串联
const promiseToDoSomething = () => {
  return new Promise(resolve => {
    setTimeout(() => resolve('做些事情'), 10000)
  })
}

const watchOverSomeoneDoingSomething = async () => {
  const something = await promiseToDoSomething()
  return something + ' 查看'
}

const watchOverSomeoneWatchingSomeoneDoingSomething = async () => {
  const something = await watchOverSomeoneDoingSomething()
  return something + ' 再次查看'
}

watchOverSomeoneWatchingSomeoneDoingSomething().then(res => {
  console.log(res)
})


输出: 做些事情 查看 再次查看
调试 promise 很难,因为调试器不会跳过异步的代码。 Async/await 使这非常容易,因为对于编译器而言,它就像同步代码一样

视使用场景而用