async await

167 阅读2分钟

async/await 剖析

  • async(异步的)
  • async 用于申明一个异步函数

async内部代码同步执行

  • 异步函数的内部代码执行过程和普通的函数是一致的,默认情况下也是会被同步执行
async function sayHi() {
  console.log('hi ice')
}

sayHi()

//hi ice

异步函数的返回值

  1. 异步函数的返回值和普通返回值有所区别
  • 普通函数主动返回什么就返回什么,不返回为undefined 异步函数的返回值特点

  • 异步函数的返回值特点

    • 明确有返回一个普通值,相当于Promise.resolve(返回值)
    • 返回一个thenble对象则由,then方法中的resolve,或者reject有关
    • 明确返回一个promise,则由这个promise决定
  1. 异步函数中可以使用await关键字,现在在全局也可以进行await,但是不推荐。会阻塞主进程的代码执行

异步函数的异常处理

  • 如果函数内部中途发生错误,可以通过try catch的方式捕获异常
  • 如果函数内部中途发生错误,也可以通过函数的返回值.catch进行捕获
async function sayHi() {
  console.log(res)
}
sayHi().catch(e => console.log(e))

//或者

async function sayHi() {
  try {
    console.log(res)
  }catch(e) {
    console.log(e)
  }
}

sayHi()

//ReferenceError: res is not defined

await 关键字

  1. 异步函数中可以使用await关键字,普通函数不行
  2. await特点
  • 通常await关键字后面都是跟一个Promise

    • 可以是普通值
    • 可以是thenble
    • 可以是Promise主动调用resolve或者reject
  • 这个promise状态变为fulfilled才会执行await后续的代码,所以await后面的代码,相当于包括在.then方法的回调中,如果状态变为rejected,你则需要在函数内部try catch,或者进行链式调用进行.catch操作

function requestData(url) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (url.includes('iceweb')) {
        resolve(url)
      } else {
        reject('请求错误')
      }
    }, 1000);
  })
}

async function getData() {
  const res = await requestData('iceweb.io')
  console.log(res)
}

getData()

// iceweb.io