详细分析async/await的基本知识以及用法(附Demo)

2024-06-01 08:44

本文主要是介绍详细分析async/await的基本知识以及用法(附Demo),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
    • 2.1 单异步
    • 2.2 多异步
    • 2.3 配合钩子
    • 2.4 差异
  • 3. 实战

前言

原先在小程序的时候用过这个用法,知识点差不过,推荐阅读:详细分析Js中的Promise.all基本知识(附Demo)

以下文章针对Vue3知识,但该知识和JS差不多用法

1. 基本知识

async 函数是指使用 async 关键字声明的函数,当函数被声明为 async 时,会返回一个 Promise 对象,无论该函数内部是否有异步操作

async function fetchData() {// 异步操作return await someAsyncOperation();
}

await 只能在 async 函数内部使用,它可以暂停 async 函数的执行,等待 Promise 对象的解决

async function fetchData() {let result = await someAsyncOperation();console.log(result);
}

主要的功能有如下:

  • 简化异步代码:使得异步代码的编写更加直观和类似于同步代码,避免回调地狱
  • 提高可读性:代码结构更清晰,易于理解和维护
  • 处理异步错误:通过 try/catch 结构来捕获 await 中抛出的异常

2. Demo

2.1 单异步

async function fetchData() {try {let result = await axios.get('https://api.example.com/data');return result.data;} catch (error) {console.error('Error fetching data:', error);return null;}
}

2.2 多异步

async function fetchUserDataAndPosts(userId) {try {let userData = await axios.get(`https://api.example.com/user/${userId}`);let userPosts = await axios.get(`https://api.example.com/user/${userId}/posts`);return { userData: userData.data, userPosts: userPosts.data };} catch (error) {console.error('Error fetching user data or posts:', error);return null;}
}

2.3 配合钩子

export default {async created() {try {this.userData = await this.fetchUserData();} catch (error) {console.error('Error fetching user data:', error);}},methods: {async fetchUserData() {let userId = this.$route.params.userId;let response = await axios.get(`https://api.example.com/user/${userId}`);return response.data;}}
}

2.4 差异

上述都是采用Promise对象,如果非采用非Promise对象,具体的延迟操作如下:使用setTimeout来模拟一个非Promise的异步操作

export default {async created() {try {// 使用setTimeout模拟一个非Promise的异步操作let result = await new Promise(resolve => {setTimeout(() => {resolve('Delayed operation completed');}, 2000);});// 获取到延迟操作的结果console.log(result);} catch (error) {console.error('Error:', error);}}
}

3. 实战

实战截图如下:
在这里插入图片描述

对应抽取的Demo如下:

对应的单个异步如下:

  • resetForm函数是一个异步函数,使用了async/await
  • 目的是重置表单,其中的异步操作可能是清除上传文件或重置表单的状态
const resetForm = async (): Promise<void> => {// 重置上传状态和文件formLoading.value = falseuploadRef.value?.clearFiles()
}

多异步如下:

  • 两个异步函数getSaleSummary和getPurchaseSummary,分别用于获取销售统计和采购统计
  • 使用Promise.all来同时等待这两个异步函数的结果
const getSaleSummary = async () => {saleSummary.value = await SaleStatisticsApi.getSaleSummary()saleTimeSummaryList.value = await SaleStatisticsApi.getSaleTimeSummary()
}const getPurchaseSummary = async () => {purchaseSummary.value = await PurchaseStatisticsApi.getPurchaseSummary()purchaseTimeSummaryList.value = await PurchaseStatisticsApi.getPurchaseTimeSummary()
}onMounted(async () => {loading.value = trueawait Promise.all([getSaleSummary(), getPurchaseSummary()])loading.value = false
})

这篇关于详细分析async/await的基本知识以及用法(附Demo)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020522

相关文章

#error用法

/* *检查编译此源文件的编译器是不是C++编译器 *如果使用的是C语言编译器则执行#error命令 *如果使用的是 C++ 编译器则跳过#error命令 */ #ifndef __cplusplus #error 亲,您当前使用的不是C++编译器噢! #endif #include <stdio.h> int main() {

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

SQL Server中,isnull()函数以及null的用法

SQL Serve中的isnull()函数:          isnull(value1,value2)         1、value1与value2的数据类型必须一致。         2、如果value1的值不为null,结果返回value1。         3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。        如

tensorboard-----summary用法总结

Tensorflow学习笔记——Summary用法         最近在研究tensorflow自带的例程speech_command,顺便学习tensorflow的一些基本用法。 其中tensorboard 作为一款可视化神器,可以说是学习tensorflow时模型训练以及参数可视化的法宝。 而在训练过程中,主要用到了tf.summary()的各类方法,能够保存训练过程以及参数分布图并在

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

YTKKeyValueStore用法

iOS端的尝试 后来我从后台转做iOS端的开发,我就尝试了在iOS端直接使用Key-Value式的存储。经过在粉笔网、猿题库、小猿搜题三个客户端中的尝试后,我发现Key-Value式的存储不但完全能够满足大多数移动端开发的需求,而且非常适合移动端采用。主要原因是:移动端存储的数据量不会很大: 如果是单机的应用(例如效率工具Clear),用户自己一个人创建的数据最多也就上万条。 如果

redis高级用法

redis 慢日志查询 配置参数 slowlog-log-slower-than 10000 #单位微秒 slowlog-max-len 选项指定服务器最多保存多少条慢查询日志 redis-cli slowlog get #获取慢日志1) 1) (integer) 4 # 日志的唯一标识符(uid)2) (integer) 1378781447 # 命令执

Log4j用法

日志是应用软件中不可缺少的部分,Apache的开源项目Log4j是一个功能强大的日志组件,提供方便的日志记录,具体请参考Log4j文档指南。 Log4j下载 在apache网站,可以免费下载到Log4j最新版本的软件包 Apache log4j  (推荐) Apache log4j 2 Log4j的包下载完成后,解压,将其中打包好的的log4j-1.x.x.jar导入你的工程

sql之top用法

TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。 注释: 并非所有的数据库系统都支持 TOP 子句。 SQL Server 的语法: SELECT TOP number|percent column_name(s)FROM table_name MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的 M

Rust:Future、async 异步代码机制示例与分析

0. 异步、并发、并行、进程、协程概念梳理 Rust 的异步机制不是多线程或多进程,而是基于协程(或称为轻量级线程、微线程)的模型,这些协程可以在单个线程内并发执行。这种模型允许在单个线程中通过非阻塞的方式处理多个任务,从而实现高效的并发。 关于“并发”和“并行”的区别,这是两个经常被提及但含义不同的概念: 并发(Concurrency):指的是同时处理多个任务的能力,这些任务可能在同一时