Async和Await

111 阅读2分钟

基本原理

async作为一个关键字放在函数前面,表示该函数是一个异步函数,异步函数意味着该函数的执行不会阻塞后面代码的执行;而await用于等待一个异步方法执行完成;async/await的作用就是使异步操作以同步的方式去执行。

const getData = (count)=>{
  return new Promise((resolve,reject)=>{
      setTimeout(()=>{
        resolve(count*3)
      },2000)
  })
}

async function countAll() {
  const firstResult = await getData(1);
  // 1s 后打印 3
  console.log('firstResult: ', firstResult); //firstResult:  3
  // 等待 firstPromise 的状态发生变化后执行
  const nextResult = await getData(firstResult); //nextResult:  9
  // 2s 后打印 9
  console.log('nextResult: ', nextResult); 
  return nextResult;
}

countAll().then((e)=>{
  console.log(e) //9
}).catch((error)=>{
  console.log(error)
})

简单总结

  • 调用 async 函数后返回的是一个 Promise 对象,通过 then 回调可以拿到 async 函数内部 return 语句的返回值  

  • 调用 async 函数后返回的 Promise 对象必须等待内部所有 await 对应的 Promise 执行完(这使得 async 函数可能是阻塞式执行)后才会发生状态变化,除非中途遇到了 return 语句

  • await 命令后如果是 Promise 对象,则返回 Promise 对象处理后的结果,如果是原始数据类型,则直接返回原始数据类型

  • async 函数内部抛出的错误,会导致函数返回的 Promise 对象变为 rejected 状态,从而可以通过 catch 捕获

  • await会阻塞代码的执行,await一定写在async标记的函数内部

  • 带 async 关键字的函数,它使得你的函数的返回值必定是 promise 对象

async带的函数一定有promise对象,如果其中有 await 那就是等,等到await Promise对象再进行返回。

其实await不仅仅用于等Promise对象,还可以等任意表达式,所以await后面实际是可以接普通函数调用或者直接量的,不过我们更多的是放一个返回promise 对象的表达式。他等待的是promise对象执行完毕,并返回结果。