JavaScript异步编程:async、await的使用

news2024/12/23 19:44:20

async 和 await 是在 ECMAScript 2017 (ES7) 中引入的特性,用于处理异步操作。它们允许你以一种更加简洁和同步的方式来编写异步代码。

async 函数表示它会返回一个 Promise,而 await 关键字用于等待一个 Promise 解决。

关于 promise 的详细介绍,请点击浏:《ECMAScript6语法:Promise》

1、使用 async 修饰符函数

 async 是一个函数修饰符,用于声明一个函数是异步的。调用 async 函数时,该函数会立即返回一个 Promise 对象,即使函数体内部没有显式返回 Promise,JavaScript 也会自动将函数的结果封装成 Promise 对象。

语法格式:

//使用 async 关键字修饰函数,被修饰的函数,一定返回 Promise 对象
async function asyncFun() {
    return "pan_junbiao的博客";
}

//上述代码,相当于
async function asyncFun() {
    return new Promise((resolve, reject) => {
        resolve("pan_junbiao的博客");
    });
}

//打印函数结果:一个 Promise 对象
console.log(asyncFun());

//打印 Promise 对象的值:pan_junbiao的博客
asyncFun().then((result) => console.log(result));

2、使用 await 等待 Promise 结果

await‌ 必须在 async 函数内部使用。它可以让异步代码像同步代码一样执行,等待 Promise 对象解决后再继续执行下一步。await 后面可以接非 Promise 对象(返回该对象的结果)或者 Promise 对象(返回对应的值)。

语法格式:

// 1、使用 async 关键字修饰函数,被修饰的函数,一定返回 Promise 对象
async function asyncFun() {
    return new Promise((resolve, reject) => {
        //使用定时器,模拟异步效果,等待3秒后,返回结果
        setTimeout(() => { resolve("pan_junbiao的博客") }, 3000);
    });
}

// 2、使用 await 等待 Promise 执行完成后返回结果(注意:await‌ 必须在 async 函数内部使用)
async function getUserName() {
    let userName = await asyncFun();
    console.log("用户名称:", userName);
}

// 3、执行方法
getUserName();

执行结果:

3、什么是回调地狱

回调地狱是指在异步编程中,由于多个回调函数嵌套调用,导致代码可读性差、难以维护的情况‌。

在 JavaScript 中,回调函数常用于处理异步任务,如 AJAX 请求、Promise 执行和事件绑定等。一旦操作完成,JavaScript 引擎会调用回调函数来处理结果。然而,当多个异步操作连续进行,且每个操作都需要在上一个操作完成后才能执行时,就会出现回调地狱。

回调地狱的问题包括:可读性差,错误处理困难,代码维护困难,以及控制流困难。为了解决这些问题,开发者采用了多种方法,包括使用 Promises、Async/Await、Generators 以及功能编程库等。这些方法使得异步代码的编写更加简洁、易读和易于维护‌。

4、Vue项目实例

【实例】创建 Vue 项目,使用 async、await函数,实现首先获取用户信息,然后根据用户信息中的部门编号,获取部门信息。

(1)创建 Vue 项目

创建 Vue 项目和使用 axios 二次封装实现 Ajax 请求功能,详情请点击浏览文章:《Vue使用axios二次封装、解决跨域问题》

(2)创建 UserInfo.vue 组件

<template>
    <h3>基本信息</h3>
    <p>用户名称:{{ userInfo.userName }}</p>
    <p>博客信息:{{ userInfo.blogName }}</p>
    <p>博客地址:{{ userInfo.blogUrl }}</p>
    <h3>部门信息</h3>
    <p>部门编号:{{ userInfo.departmentCode }}</p>
    <p>部门名称:{{ userInfo.departmentName }}</p>
    <button @click="getUser(1)">查询用户</button>
</template>

<script setup>
import { getUserInfo } from '@/api/UserApi.js';
import { getDepartmentInfo } from '@/api/DepartmentApi.js';
import { ref } from 'vue';

// 用户信息:使用 ref 定义一个响应式对象
let userInfo = ref({});

// 常规写法:形成“回调地狱”,代码可读性差,维护困难
// function getUser(userId) {
//     // 1、获取用户信息
//     getUserInfo(userId).then(
//         function (result) {
//             userInfo.value = result;

//             //2、获取部门信息
//             getDepartmentInfo(userInfo.value.departmentCode).then(
//                 function (department) {
//                     userInfo.value.departmentCode = department.departmentCode;
//                     userInfo.value.departmentName = department.departmentName;
//                 }
//             );
//         }
//     );
// }

// 使用 async、await 优化写法,代码简洁,易于维护
async function getUser(userId) {
    // 1、获取用户信息
    let userResult = await getUserInfo(userId);
    userInfo.value = userResult;

    //2、获取部门信息
    let department = await getDepartmentInfo(userInfo.value.departmentCode);
    userInfo.value.departmentCode = department.departmentCode;
    userInfo.value.departmentName = department.departmentName;
}

</script>

执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蜂窝物联网全网通sim卡切网技术方案软硬件实现教程(设备根据基站信号质量自动切网)

01 物联网系统中为什么要使用三合一卡 三合一卡为用户解决了单一运营商网络无法全覆盖的缺陷&#xff0c;避免再次采购的经济成本以及时间成本和因没有信号设备停止工作造成的损失&#xff0c;保证仅需一次采购并提高设备工作效率和入网活跃度。例如下面地区的设备&#xff0…

Spring Web MVC课后作业

目录 1.加法计算器 2.⽤户登录 3.留⾔板 1.加法计算器 &#xff08;1&#xff09;需求分析 加法计算器功能, 对两个整数进⾏相加, 需要客⼾端提供参与计算的两个数, 服务端返回这两个整数计算 的结果。 &#xff08;2&#xff09;接⼝定义 请求路径&#xff1a; calc/sum 请…

Java框架学习(mybatis)(01)

简介&#xff1a;以本片记录在尚硅谷学习ssm-mybatis时遇到的小知识 详情移步&#xff1a;想参考的朋友建议全部打开相互配合学习&#xff01; 官方文档&#xff1a; MyBatis中文网https://mybatis.net.cn/index.html 学习视频&#xff1a; 067-mybatis-介绍和对比_哔哩哔…

Linux本地服务器搭建开源监控服务Uptime Kuma与远程监控实战教程

文章目录 前言**主要功能**一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址…

docker - maven 插件自动构建镜像(构建镜像:ebuy-docker:v2.0)

文章目录 1、docker服务端开启远程访问2、在pom.xml文件plugins下添加Maven的docker插件3、编写dockerfile文件4、执行maven的打包命令5、查看 镜像 ebuy-docker:v2.06、创建 容器 ebuy-dockerv2.0 上面手动构建镜像的过程比较繁琐&#xff0c;使用Maven的docker插件可以实现镜…

MySQL数据库进阶知识(五)《锁》

学习目标&#xff1a; 一周掌握数据库锁相关知识 学习内容&#xff1a; 一. 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共…

Word2vec的应用

目录 1.分词 2.模型训练 3.可视化 4.知识点个人理解 pip install gensim -i https://pypi.tuna.tsinghua.edu.cn/simple #若在jupyter notebook中安装&#xff1a; ! pip install gensim -i https://pypi.tuna.tsinghua.edu.cn/simple #导包 import jieba import re import…

一种能够一机两用的源代码保密方案

在数字化时代&#xff0c;企业面临的数据泄露风险日益增加&#xff0c;保护机密数据的安全成为了一项重要任务。SDC沙盒技术作为一种先进的数据保密解决方案&#xff0c;通过创新的沙盒概念&#xff0c;在防泄密领域展现了其独特的价值和作用。 一、SDC沙盒技术简介 SDC沙盒技…

使用ucharts写的小程序页面柱状图上方没有数字

使用uCharts官网 - 秋云uCharts跨平台图表库写的柱状图如何让柱子上放没有数据 更改前 更改后 使用uCharts官网 - 秋云uCharts跨平台图表库 写的小程序图表&#xff0c;无论是柱状图还是折线图添加一个 dataLabel: false, // 不显示数据 九可以实现不显示数据 const opts …

必看!道路运输企业主要负责人和安全生产管理人员考核新动向

必看&#xff01;道路运输企业主要负责人和安全生产管理人员考核新动向 道路运输企业两类人员#叙后尘 道路运输企业主要负责人和安全生产管理人员报考 交通运输主管部门具体组织实施本行政区域内道路运输企业主要负责人和安全生产管理人员安全考核有关工作&#xff0c;并在…

无网络entos7报错ImportError: /lib64/libm.so.6: version `GLIBC_2.27‘ not found更新glibc

最近在尝试使用sklearn的升级版cuml&#xff0c;因为是一台没有连接互联网的gpu机器&#xff0c;所以构建cuml环境过程很坎坷&#xff0c;需要各种将各种whl包在线下载后上传到服务器中。 当我终于解决完包的互相依赖问题后&#xff0c;在import cuml时候遇到一个错误&#xff…

【线程】线程池

线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现&#xff0c;线程池中的线程可以从阻塞队列中获取任务进行任务处理&#xff0c;当线程都处于繁忙状态时可以将任务加入阻塞队列中&#xff0c;等到其它的线程空闲后进行处理。 线程池作用&#xff1a; 1.降…

三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...)

三&#xff0c;MyBatis-Plus 的各种查询的“超详细说明”&#xff0c;比如(等值查询&#xff0c;范围查询&#xff0c;模糊查询…) 文章目录 三&#xff0c;MyBatis-Plus 的各种查询的“超详细说明”&#xff0c;比如(等值查询&#xff0c;范围查询&#xff0c;模糊查询...)1. …

2024中国新能源汽车零部件交易会,开源网安展示了什么?

近日&#xff0c;2024中国新能源汽车零部件交易会在十堰国际会展中心举行。开源网安车联网安全实验室携车联网安全相关产品及解决方案亮相本次交易会&#xff0c;保障智能网联汽车“车、路、云、网、图、边”安全&#xff0c;推动智能网联汽车技术突破与产业化发展。 中国新能源…

MySQL InnoDB MVCC数据结构分析

1、概述 MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制&#xff0c;通过维护不同的版本号&#xff0c;提供一种很好的并发控制技术&#xff0c;这种技术能够使读写操作不冲突&#xff0c;提升并发性能。 MySQL InnoDB存储引擎&#xff0c;在更…

【雅特力AT32】IIC使用指南_附读写EEPROM案例

目录 1.12C接口简介 2.12C接口通信 2.1主机通信流程 2.1.1 主机通信初始化 1>主机时钟初始化 2>主机通信初始化 3>主机 10 bits 寻址的特殊时序初始化 2.1.2 主机通信初始化软件接口 2.1.3 主机发送流程 2.1.4 主机发送流程软件接口 2.1.5 主机接收流程 2.1.6 主机接收…

传输大咖47 | 软件企业文件传输难题?这款FTP替代工具了解一下

随着信息技术的飞速发展&#xff0c;软件企业对数据传输的需求日益增长。虽然传统的FTP&#xff08;文件传输协议&#xff09;曾经是企业数据交换的主要力量&#xff0c;但其在许多方面的局限性已经逐渐成为企业发展的瓶颈。接下来&#xff0c;我们将带您讨论FTP的缺点&#xf…

又一个行业被背刺了,AI做服装设计这么简单,谁还需要设计师?

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;越来越多的行业开始借助AI的力量实现创新&#xff0c;而服装设计这一传统行业也无法幸免。 在过去&#xff0c;服装设计是创意与手工结合的高门槛行业&#xff0c;需要设计师花费大量时间和精力去构思、打样…

bootstrap4显示与隐藏元素方法

bootstrap4显示与隐藏元素方法 bootstrap4隐藏元素、显示元素其实非常的简单&#xff0c;因为bootstrap4已经为我们提供了相应的类&#xff0c;只需要按照它的规则去命名就可以了。 使用我们的响应式显示实用程序类更改display属性的值。我们特意只支持 的所有可能值的一个子…

国产DSP,自研指令集内核C2000,F28335、F280049、F28377

国产DSP&#xff0c;自研指令集内核架构&#xff0c;自研工具链&#xff0c;完美替代TI的 C2000系列产品&#xff0c;F280049、F28335、F28377 性能、主频、外设、内存&#xff0c;全面提高30%-80%&#xff0c; 基于eclipse做的IDE&#xff0c;满足工程师的使用习惯&#xff0c…