async和await的使用

184 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一. 什么是async

开发中我们最常用的Promise有一个语法糖,就是async,翻译成中文是异步;它是一个修饰符,作用是将函数标记为异步函数,同时这个函数的返回值变成promise。

    async function foo() {
      return ["abc", "cba", "nba"]
    }

    foo2().then(res => {
      console.log("res:", res)
    })

二. 什么是await

await翻译成中文是等待,必须放在async修饰的函数中使用;await修饰的如果是promise对象,那么可以获取到promise中返回的内容(resolve、reject函数),且获取到值才会继续执行该函数的代码;如果修饰的不是promise,那么就会将值作为await表达式的结果,不会起到阻塞函数内代码的作用,所以最常用的才是修饰promise函数。

    function foo(t){
      setTimeout(function(){
          console.log(t);
      },t)
    }
    async function foo1(){
        let a = await foo(1000);
        let b = await log(3000);
        let c = log(2000);
        console.log(a);
        console.log(1)
    }
    foo1(); 
// 输出结果为:undefined、1、1000、2000、3000
// 解析:因为foo函数不是Promise函数,所以await只会将它作为一个返回值,不会阻塞后面的代码执行,所以刚开始的a是undefined,加不加await对这个函数的执行没有什么影响,三个定时器依旧按照等待时间长短先后执行。 

    function bar() {
      console.log("bar function")
      return new Promise(resolve => {
        setTimeout(() => {
          resolve(123)
        }, 1000)
      })
    }

    async function foo() {
      console.log("-------")
      // await后续返回一个Promise, 那么会等待Promise有结果之后, 才会继续执行后续的代码
      const res1 = await bar()
      console.log("await后面的代码1:", res1)
      const res2 = await bar()
      console.log("await后面的代码2:", res2)
      console.log("+++++++")
    }


    function foo1(){
      return new Promise((resolve,reject)=> {
        console.log(123321);
        resolve('abc')
      })
    }
    foo()
    foo1().then(res=>console.log(res))
    console.log(123);

// 输出结果:----、bar function、123321、123、abc、await后面的代码1:123、、bar function、await后面的代码2:123、++++++
// 解析:await修饰的Promise函数,所以在输出完-----后,遇到await就会去先执行Promise,输出bar function,代码被阻塞,输出foo1以及后面的代码,当后面代码执行完,开始执行async函数内代码

三. 常规结合起来使用方法

一般用于网络请求,不用再then回调,写法会更加美观

    function requestData() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('网络请求结果')
        }, 2000);
      })
    }

    async function getData() {
      const res = await requestData()
      console.log(res1)
    }

    getData()