想搭建网站学什么/宁波网站建设的公司
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分钟后会爆炸。 问题:能够安全拆弹…...

Java爬虫:获取SKU详细信息的艺术
在电子商务的世界里,SKU(Stock Keeping Unit,库存单位)是每个商品的唯一标识符,它包含了商品的详细信息,如尺寸、颜色、价格等。对于商家和开发者来说,获取商品的SKU详细信息对于库存管理、订单…...

心理咨询展示网站建设渠道拓展
心理问题长期以来都受到关注,每个城市里也都有相关服务商家,除了进店外,线上也可以开展咨询服务,对需求者来说需要找到靠谱的品牌,而商家也需要触达到更多客户获取转化。 网站是品牌线上工具,利于商家通过…...

naocs注册中心,配置管理,openfeign在idea中实现模块间的调用,getway的使用
一 naocs注册中心步骤 1 nacos下载安装 解压安装包,直接运行bin目录下的startup.cmd 这里双击运行出现问题的情况下 (版本低的naocs) 在bin目录下 打开cmd 运行以下命令 startup.cmd -m standalone 访问地址: http://localh…...

先进封装技术 Part02---TSV科普
一、引言 随着电子设备向更小型化、更高性能的方向发展,传统的芯片互连技术已经无法满足日益增长的需求。在这样的背景下,TSV(Through-Silicon Via,硅通孔)技术应运而生,成为先进封装技术中的核心之一。 如果我们看大多数主板,可以看到两件事:第一,芯片之间的大多数连…...

【数据挖掘】2023年 Quiz 1-3 整理 带答案
目录 Quiz 1Quiz 2Quiz 3Quiz 1 Problem 1(30%). Consider the training data shown below. Here, A , B A, B A,B, and...

老古董Lisp实用主义入门教程(12):白日梦先生的白日梦
白日梦先生的白日梦 白日梦先生已经跟着大家一起学Lisp长达两个月零五天! 001 粗鲁先生Lisp再出发002 懒惰先生的Lisp开发流程003 颠倒先生的数学表达式004 完美先生的完美Lisp005 好奇先生用Lisp来探索Lisp006 好奇先生在Lisp的花园里挖呀挖呀挖007 挑剔先生给出…...

UE5 Windows热更新解决方案思路(HotPatcher+Tomcat+RuntimeFilesDownloader)
以下个人学习笔记。其中必会存在一些问题,仅作参考。本人版本5.1。 参考视频: UE4热更新:HotPatcher插件使用教程_哔哩哔哩_bilibili 3.检查需要下载的版本_哔哩哔哩_bilibili 参考文章: UE 热更新:Questions &…...

进程管理工具:非daemon进程管理工具supervisor
一、非daemon进程管理工具:supervisor Windows安装supervisor https://pypi.org/project/supervisor-win/4.5.0/#files 一)进程管理supervisor简介 supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程&…...

c++模拟真人鼠标轨迹算法
一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言,利用其高性能和系统级访问能力,开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL(动态链接库),可以方便地在不同的编程环境中调用,实现跨语言的兼…...

android12/13/14版本wms最新面试题:dumpsys window和sf一定会一致么?
背景: 近期学员们学习了马哥wms课程后,去参加相关的大厂的framework面试,有一个学员朋友带回来了一个wms相关的面试题,具体面试题描述如下: 问题1 请问wms的window和SurfaceFlinger的Layer有什么关系? 回…...