async与await

106 阅读2分钟

1 概念

async

  • 用来声明一个异步函数
async function someName(){...}
  • 它自动将常规函数转换成Promise,返回值也是一个Promise对象
  • 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
  • 异步函数内部可以使用await
  • async函数完全可以看作多个异步操作,包装成的一个 Promise 对象

await

  • 用于等待一个Promise 对象,暂停异步的功能执行
let result = await someAsyncCall()
  • 放置在Promise调用之前,await强制其他代码等待,直到Promise完成并返回结果
  • 它只能在异步函数 async function 中使用
  • 它返回 Promise 对象的处理结果,如果等待的不是 Promise 对象,则返回该值本身
async function f() {
  let y = await 20;
  console.log(y); // 20
}
f();
  • 若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行 async function
  • 若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出
  • 如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身

2 如何使用

async 函数的几种使用形式

await的使用

  • 如果 Promise 处理异常,则异常值被抛出
async function f() {
  try {
    var z = await Promise.reject(30);
  } catch (e) {
    console.log(e); // 30
  }
}
f3();

3 使用场景

场景一

  • 我们同时发出三个不互相依赖的请求,如果用Async/Await就显得不明智了
  • 假设ABC执行分别需要2、3、4秒,则下面代码执行完要9s

  • 此时我们需要用Promise.all()将异步调用并行执行,只需要4s

场景二

  • 接口之间就存在了彼此依赖的关系,Async跟Await就有了用武之地,让异步请求之间可以按顺序执行

  • 如果用.then()的方式,则显得有些繁琐