乐趣区

asyncawait实现异步调用

async/await 多个函数关联调用

async/await 使得异步代码看起来像同步代码
async 函数会隐式地返回一个 promise,而 promise 的 reosolve 值就是函数 return 的值
Async/Await 不需要写.then,不需要写匿名函数处理 Promise 的 resolve 值,也不需要定义多余的 data 变量,还避免了嵌套代码
async 声明一个异步函数
await 只能在 async 函数中使用,后面跟一个 promise 对象
所以在模拟异步调用函数时,函数体内返回 promise

async/await 缺点

async 函数里,无论是 Promise reject 的数据还是逻辑报错,都会被默默吞掉。所以最好把 await 放入 try{}catch{}中,或者在 async 返回的 promise 对象中使用.cache 捕获错误。

实现

项目中实现三个不同的接口调用,三个接口是相互关联的,前一个接口的返回值是后一个接口的参数,如果使用 Promise 实现的话,只能实现异步调用,但是无法相互关联,也就是数据不互通,所以使用 async/await 实现

  • 接口调用的方法独立封装,参数可动态设置
  • async 声明异步方法,内部使用 await 关键字调用封装的接口,参数可直接传入
  • async/await 相当于将 Promise 异步调用同步化,数据可实现关联
  • async/await 会默认返回一个 Promise 对象,在实际调用中使用 cache 捕获错误

代码实现

<script>
  // 再此使用定时器模拟异步接口的调用
  // 异步函数 a
  function a() {
    return new Promise(resolve => {setTimeout(()=>{resolve('a')
      }, 1000)
    })
  }
  // 异步函数 b, 关联 a 参数
  function b(a) {
    return new Promise(resolve => {setTimeout(()=>{resolve(a+'b')
      }, 1000)
    })
  }
  // 异步函数 c,关联 b 参数
  function c(b) {
    return new Promise(resolve => {setTimeout(()=>{resolve(b+'c')
      }, 1000)
    })
  }

  // 同步执行三个关联的异步函数
  async function d(){const da = await a();
      const db = await b(da);
      const dc = await c(db);
      return dc;
  }

  // 实际调用
  d().then(res=>{console.log(res)
  }).catch(err=>{console.log(err)
  });
</script>
退出移动版