前端笔记(9) Vue3 async await 循环调接口使用案例

简介

async和await是JavaScript的语法,具体详细介绍可以看阮一峰的教程async 函数
这里我只是介绍在日常开发中,async和await的常见用法。

  • async:异步函数,返回的是一个Promise对象,可以使用then方法添加回调函数。
  • await:对紧跟在await后面的表达式,需要等待它的结果,其完成后再接着执行后面的语句。
  • await关键字只能放在async函数里,await配合async一起使用

async

定义一个异步方法很简单,在函数前边加上 async 关键字即可。

<template>
  <el-button @click="buttonClick">我是按钮</el-button>
</template>

<script setup lang="ts">
//用async定义一个异步函数
async function sayHello(num: string) {
  return "Hello,亚瑟王" + num
}

function buttonClick() {
  sayHello("1").then(result => {
    console.log(result)
  })
  console.log("虽然我在后边,但是我先执行")
}
</script>

运行结果:
在这里插入图片描述
可以看到sayHello()的返回值是后打印出的,因为它是异步方法。

await

await 会让它后面的表达式变成同步,当该表达式执行完成后,才会继续执行下面的代码。
对上面的buttonClick()进行修改:

  • function buttonClick()的前面加上async
  • sayHello的前面加上await
  • 修改最后打印的中文
async function buttonClick() {
  await sayHello("1").then(result => {
    console.log(result)
    return result
  });
  console.log("虽然我在后边,但是我先执行,是真的吗?")
}

运行结果:
在这里插入图片描述
可以看出sayHello()先执行完成,在执行最后一句console.log()的。

案例:在for循环中调用异步函数

  • 重要的注意点:循环调用异步函数,要用for,不能用forEach
  • listByDictTypeCode()是一个异步函数,根据code调用后端接口,返回字典数据

1 不使用async和await

function myFunction() {
  const dictMap = getDictMap();
  console.log("aa的值 = " + dictMap.get("aa"))
}

function getDictMap() {
  const dictMap = new Map<string, DictDatas[]>();
  let codes = ['aa', 'bb', 'cc'];
  
  for (const code of codes) {
     listByDictTypeCode(code).then(resp => {
      dictMap.set(code, resp.data);
    })
  }
  console.log("已经返回" + dictMap.size + "条");
  return dictMap;
}

运行结果:
在这里插入图片描述
虽然listByDictTypeCode()确实执行了,但是最后的return dictMap在listByDictTypeCode()执行完成之前就已经返回了,所以myFunction()里没有获取到字典值。

2 使用async和await来解决

function myFunction() {
  const dictMap = getDictMap();
  dictMap.then(result => {
    console.log("aa的值 = " + result.get("aa"))
  })
}

async function getDictMap() {
  const dictMap = new Map<string, DictDatas[]>();
  let codes = ['aa', 'bb', 'cc'];

  for (const code of codes) {
    await listByDictTypeCode(code).then(resp => {
      dictMap.set(code, resp.data);
    })
  }
  console.log("已经返回" + dictMap.size + "条");
  return dictMap;
}

运行结果:
在这里插入图片描述
从结果可以看到,是等待listByDictTypeCode()都执行完成后,再return dictMap的。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑟 王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值