async和await是JavaScript的语法,具体详细介绍可以看阮一峰的教程async 函数。
这里我只是介绍在日常开发中,async和await的常见用法。
定义一个异步方法很简单,在函数前边加上 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 会让它后面的表达式变成同步,当该表达式执行完成后,才会继续执行下面的代码。
对上面的buttonClick()进行修改:
async function buttonClick() {
await sayHello("1").then(result => {
console.log(result)
return result
});
console.log("虽然我在后边,但是我先执行,是真的吗?")
}
运行结果:

可以看出sayHello()先执行完成,在执行最后一句console.log()的。
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()里没有获取到字典值。
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的。