async await 介绍 从0手动实现async await
1 async await介绍
async 和 await 是用于处理异步编程的语法糖,它们简化了异步操作的编写,使其看起来像同步代码。通过 async 标记一个函数为异步函数,返回的是一个 Promise 对象,而 await 用来暂停执行,直到 Promise 解决9相当于then函数),错误处理使用try...catch...(相当于catch),从而实现异步流程的同步化表达。下面将通过代码示例逐步解释上面一段话。
1.1 async 标记函数 返回 Promise 对象
调用async方程式将会返回Promise对象,即使返回值不是Promise也会包装,相当于调用了Promise上的静态类方法resolve对返回值进行了封装,代码如下:
async function asyncFunction() {console.log("inside asyncFunction");return 'Hello';
}async function undefinedFunction(){console.log("inside undefinedFunction");console.log('no return value');
}// 调用async函数时会立即执行函数内部的代码,并且将返回一个promise对象
console.log(asyncFunction()); // Promise { 'Hello' } // async function always return a promise
// 相当于resolve了一个promise
Promise.resolve('Hello')
console.log(undefinedFunction()); // Promise { undefined }
// 输出结果:
// inside asyncFunction
// Promise { 'Hello' }
// inside undefinedFunction
// Promise { undefined }
1.2 await 用来暂停执行,直到 Promise 解决 错误处理
await 的工作原理类似于调用 Promise 的 then 方法,等待 Promise 从 pending 状态变为 fulfilled 状态后返回结果(相当于暂停代码了,后面都是回调函数callback)。如果 Promise 失败或一直处于 pending 状态,将会在下文介绍。因为 async 函数返回的是一个 Promise,所以 await 后面不仅可以跟 Promise,也可以跟 async 函数或其他值。若是其他值,JavaScript 会先将其转换为 Promise.resolve(val),再继续执行。这样 await 可以兼容不同类型的数据并处理异步操作。
下面代码是一般的await的使用,演示了Promise,async function,normal value的处理情况。
(async function awaitTestFunction() {// await 处理async函数返回的promise对象let res = await asyncFunction()console.log(res) // Hello// await 处理promise对象res = await new Promise((resolve) => {setTimeout(() => {resolve('world')}, 1000)})console.log(res) // world// await 处理普通值res = await 'normal value'console.log(res) // normal value
})();
// 最终输出结果
// Hello
// world
// normal value
当出现Promise一直处于pending状态,throw error 或者rejected状态就会代码执行,这时就要使用try catch捕获错误(这样就替代了.catch的作用)如下所示:
async function pendingFunction(){console.log("inside pendingFunction");// await将会一直等待promise对象的状态变为resolved,在node环境中将会直接导致程序退出await new Promise(() => {})// 将会无法执行到这里console.log('after pending')
}async function rejectFunction(){console.log("inside rejectFunction");try {// 抛出错误await new Promise((undefined, reject) => {// reject('reject error during new Promise instance')throw new Error('throw error')})} catch (error) {console.log(error) // reject}// 不使用try catch将会无法执行到这里console.log('after reject')
}async function Testall(){// await awaitTestFunction()// await pendingFunction()await rejectFunction()
}Testall()
await一直处于pending状态将会导致程序直接中断。await后面的错误不使用try...catach捕获将会导致程序报错终止 。
1.3 async和await综合使用
现在将上面所有的async函数按照从前到后的顺序依次执行,实现异步操作变为同步操作,代码如下所示:
async function asyncFunction() {console.log("inside asyncFunction");return 'Hello';
}async function undefinedFunction(){console.log("inside undefinedFunction");console.log('no return value');
}async function awaitTestFunction() {// await 处理async函数返回的promise对象let res = await asyncFunction()console.log(res) // Hello// await 处理promise对象res = await new Promise((resolve) => {setTimeout(() => {resolve('world')}, 1000)})console.log(res) // world// await 处理普通值res = await 'normal value'console.log(res) // normal value
}async function pendingFunction(){console.log("inside pendingFunction");// await将会一直等待promise对象的状态变为resolved,在node环境中将会直接导致程序退出await new Promise(() => {})// 将会无法执行到这里console.log('after pending')
}async function rejectFunction(){console.log("inside rejectFunction");try {// 抛出错误await new Promise((undefined, reject) => {// reject('reject error during new Promise instance')throw new Error('throw error')})} catch (error) {console.log(error) // reject}// 不使用try catch将会无法执行到这里console.log('after reject')
}// 如果顶层异步函数之间资源有先后要求,可以使用await来保证执行顺序
async function Testall(){await asyncFunction()await undefinedFunction()await awaitTestFunction()// await pendingFunction()await rejectFunction()
}Testall()
1.4 手写代码实现async和await逻辑-待定
1.5 总结与注意事项
- 不能在全局作用域顶层使用await,将异步操作封装在async函数中然后再调用。
- async和await与Promise是相辅相成的,async相当于new Promse,await相当于.then方法,使用try...catch...相当于.catch方法
- async和await是语法糖,将异步执行的代码转变为同步执行(这是由于js单线程执行的特性)。
- async 函数返回 Promise:当一个函数使用 async 关键字定义时,它会自动返回一个 Promise,即使函数内部没有显式返回 Promise。
- await 等待异步操作完成:await 用于暂停 async 函数的执行,等待 Promise 解决(fulfilled),并返回其结果。
- 兼容同步值:await 不仅可以处理 Promise,如果跟随的是非 Promise 值,会被自动包装为 Promise.resolve(val)。
相关文章:
async await 介绍 从0手动实现async await
1 async await介绍 async 和 await 是用于处理异步编程的语法糖,它们简化了异步操作的编写,使其看起来像同步代码。通过 async 标记一个函数为异步函数,返回的是一个 Promise 对象,而 await 用来暂停执行,直到 Promise…...
UDP校验和计算及网络中的校验和机制
UDP (User Datagram Protocol) 是一种无连接的传输层协议,它不像 TCP 那样提供可靠的传输保证。虽然 UDP 不保证数据可靠性,但它仍然提供了一个可选的校验和机制来检测数据在传输过程中出现的错误。 理解UDP校验和的计算过程和其在网络中的作用至关重要。…...
如何使用C语言接入Doris数据库
如何使用C语言接入Doris数据库 一、环境准备1. 安装MySQL C API2. Doris数据库环境二、编写C语言接入代码1. 包含必要的头文件2. 编写连接和查询函数3. 编译和运行程序三、注意事项1. 安全性2. 错误处理3. 性能优化4. 兼容性5. 调试和日志记录四、结论Doris(之前称为Palo或Apa…...
DarkLabel 2.4 目标追标注工具介绍
DarkLabel介绍 https://github.com/darkpgmr/DarkLabel 官方地址 视频/图像标注工具,很适合用于目标追踪任务 DarkLabel可以在视频和图像中标注物体的边界框,并附上 ID 和name。还可以用于裁剪视频、从视频中采样训练图像以及对图像区域进行马赛克处理…...
uniapp设置从右上角到左下角的三种渐变颜色
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
Python 解析 html
一、场景分析 假设有如下 html 文档: 写一段 python 脚本,解析出里面的数据,包括经度维度。 <div classstorelist><ul><li lng"100.111111" lat"10.111111"><h4>联盟店1</h4><p>…...
“大数据+高职”:VR虚拟仿真实训室的发展前景
随着信息技术的迅猛发展,大数据技术与虚拟现实(VR)的融合正在为高等教育,尤其是高等职业教育(高职)带来革命性的变革。VR虚拟仿真实训室作为这一技术融合的典型应用,正逐步展现其在提升教育质量…...
Pygame中Sprite实现逃亡游戏4
在《Pygame中Sprite实现逃亡游戏3》中实现了玩家跳跃飞火的效果,接下来通过精灵类的碰撞检测来判断飞火是否击中玩家、飞火是否击中飞龙以及飞龙是否抓住玩家。 1 飞火是否击中玩家的判断 判断飞火是否击中玩家的代码如图1所示。 图1 判断飞火是否击中玩家的代码 …...
sentinel原理源码分析系列(一)-总述
背景 微服务是目前java主流开发架构,微服务架构技术栈有,服务注册中心,网关,熔断限流,服务同学,配置中心等组件,其中,熔断限流主要3个功能特性,限流,熔断&…...
创建数据/采集数据+从PI数据到PC+实时UI+To PLC
Get_Data ---------- import csv import os import random from datetime import datetime import logging import time # 配置日志记录 logging.basicConfig(filename=D:/_Study/Case/Great_Data/log.txt, level=logging.INFO, format=%(asctime)s - %(l…...
Linux基础入门 --12 DAY(SHELL脚本编程基础)
shell脚本编程 声明:首行shebang机制 #!/bin/bash #!/usr/bin/python #!/usr/bin/perl 变量 变量类型 变量类型: 内置变量 : 如 PS1 , PATH ,HISTSIZE 用户自定义变量 不同变量存放数据不同,决定了以下 1.数据存储方式 2.参与的运算 3.表示…...
关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI
Web 界面 官方文档:https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…...
Hive数仓操作(一)
Hive 介绍 Hive 是一个基于 Hadoop 的数据仓库工具,旨在简化大规模数据集的管理和分析。它将结构化数据文件映射为表,并提供类似 SQL 的查询功能。Hive 的数据存储在 Hadoop 分布式文件系统(HDFS)中,使用 Hive 查询语…...
什么是NAND Flash?
什么是NAND Flash? NAND闪存是一种非易失性存储器技术,它彻底改变了数字时代的数据存储。它是闪存的一种形式,这意味着它可以被电擦除和重新编程。NAND闪存以NAND(NOT-AND)逻辑门命名,该逻辑门用于其基本架构。术语“…...
Spring Boot 整合 Keycloak
1、概览 本文将带你了解如何设置 Keycloak 服务器,以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么? Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单…...
工程师 - Windows下使用WSL来访问本地的Linux文件系统
Access Linux filesystems in Windows and WSL 2 从 Windows Insiders 预览版构建 20211 开始,WSL 2 将提供一项新功能:wsl --mount。这一新参数允许在 WSL 2 中连接并挂载物理磁盘,从而使您能够访问 Windows 本身不支持的文件系统࿰…...
SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句
最近做一个需求,关于SQL高可用优化,需要优化项目中的SQL,提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…...
openharmony源码编译
1. win拷贝数据到虚拟机Ubuntu配置 1.打开终端,更新软件库 sudo apt-get update 2.下载安装open-vm-tools,open-vm-tools-desktop sudo apt-get install open-vm-tools open-vm-tools-desktop 3.重启 sudo reboot 2.编译环境配置 1.设置环境脚本…...
H.264编解码工具 - NVIDIA CUDA
一、简介 NVIDIA CUDA编解码是一项采用NVIDIA图形处理器(GPU)来加速视频编码和解码的技术。CUDA(Compute Unified Device Architecture)是一种并行计算平台和编程模型,允许开发者使用GPU来进行通用计算。 优点: 加速编解码速度:CUDA编解码利用GPU的并行处理能力,可以…...
数学建模小练习
题目B 电影《虎胆龙威 3》中,塞谬尔和布鲁斯扮演的主角要拆除西蒙所放的炸弹。西蒙喷泉上面有两个壶,容量分别是5加仑和3加仑,向其中一个壶中加入刚好 4 加仑的水,计时器会停止,否则5分钟后会爆炸。 问题:能够安全拆弹…...
手机当主力开发机?用Termux配置SSH连接远程服务器的完整流程(附防断连技巧)
手机变身开发终端:Termux全流程SSH配置与移动办公实战 在咖啡厅等朋友时突然需要紧急修复服务器故障,出差途中发现生产环境告警却找不到电脑——这些场景下,你的Android手机完全可以成为救命稻草。Termux这款终端模拟器配合SSH,能…...
从零开始玩转Arduino:手把手教你用MOS管和继电器控制大电流设备(附电路图)
从零开始玩转Arduino:手把手教你用MOS管和继电器控制大电流设备(附电路图) 当你第一次尝试用Arduino控制大功率设备时,可能会遇到一个常见问题:小小的开发板输出引脚根本无法直接驱动电机、灯带或加热管。这时候&#…...
硬件(6)——定时器
硬件中如何确定引脚电平的高低?硬件内部有一个比较器,类似门电路,有两个输入一个输出,其中一个输入接稳定的参考值(DCDC 3.3V),另一个输入接引脚。当引脚高于3.3V就输出高电平,引脚低于3.3V就输…...
如何创建自定义编程连字符号:Hasklig字体开发终极指南
如何创建自定义编程连字符号:Hasklig字体开发终极指南 【免费下载链接】Hasklig Hasklig - a code font with monospaced ligatures 项目地址: https://gitcode.com/gh_mirrors/ha/Hasklig Hasklig是一款专为程序员设计的等宽字体,它通过创新的连…...
如何构建Min浏览器插件:从零开始的可扩展架构指南
如何构建Min浏览器插件:从零开始的可扩展架构指南 【免费下载链接】min A fast, minimal browser that protects your privacy 项目地址: https://gitcode.com/gh_mirrors/mi/min Min浏览器作为一款注重隐私保护的轻量级浏览器,其插件系统为开发者…...
如何用智能工具提升暗黑破坏神3战斗效率:D3KeyHelper全功能指南
如何用智能工具提升暗黑破坏神3战斗效率:D3KeyHelper全功能指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 暗黑破坏神3的战斗节奏快…...
Alt App Installer革新:突破微软商店限制的Windows应用安装解决方案
Alt App Installer革新:突破微软商店限制的Windows应用安装解决方案 【免费下载链接】alt-app-installer A Program To Download And Install Microsoft Store Apps Without Store 项目地址: https://gitcode.com/gh_mirrors/alt/alt-app-installer 微软商店…...
避坑指南:RuoYi-Vue2集成Flowable 6.7.2时,关于database-schema-update和nullCatalogMeansCurrent的配置详解
深度解析:RuoYi-Vue2集成Flowable 6.7.2的数据库配置陷阱与实战策略 当企业级应用需要引入工作流引擎时,Flowable因其轻量化和高性能成为许多开发团队的首选。然而在RuoYi-Vue2框架中集成Flowable 6.7.2版本时,数据库配置环节往往成为开发者的…...
为什么你的USB摄像头总掉帧?深入UVC协议Alternate Setting配置避坑指南
为什么你的USB摄像头总掉帧?深入UVC协议Alternate Setting配置避坑指南 工业视觉检测线上,一台标称30fps的USB摄像头突然掉到15帧,导致传送带上的缺陷品漏检;手术内窥镜画面在关键时刻出现卡顿,医生不得不暂停操作——…...
DB2数据迁移实战:除了EXPORT/LOAD,这几种备份还原方法你试过吗?
DB2数据迁移实战:超越基础工具的高效策略全景 当测试环境的DB2数据库需要整体搬迁到新服务器时,大多数DBA的第一反应是使用EXPORT/LOAD这对经典组合。但真实场景中,数据迁移远不止简单的导出导入——表结构依赖、CLOB字段处理、编码转换、存储…...
