ES6 async 函数详解 (十)
async 函数是什么?一句话,它就是 Generator 函数的语法糖。
const gen = function* () {const f1 = yield readFile('/etc/fstab');const f2 = yield readFile('/etc/shells');console.log(f1.toString());console.log(f2.toString());
};const asyncReadFile = async function () {const f1 = await readFile('/etc/fstab');const f2 = await readFile('/etc/shells');console.log(f1.toString());console.log(f2.toString());
};
async 函数就是将 Generator 函数的星号( * )替换成 async ,将 yield 替换成 await ,仅此而已。
async 函数对 Generator 函数的改进,体现在以下四点:
(1)内置执行器。
Generator 函数的执行必须靠执行器,所以才有了 co 模块,而 async 函数自带执行器。也就是说, async 函数的执行,与普通函数一模一样,只要一行。
co 模块:co 模块是著名程序员 TJ Holowaychuk 于 2013 年 6 月发布的一个小工具,用于 Generator 函数的自动执行。
co 模块可以让你不用编写 Generator 函数的执行器。
// Generator 函数
var gen = function* () {var f1 = yield readFile('/etc/fstab');var f2 = yield readFile('/etc/shells');console.log(f1.toString());console.log(f2.toString());
};//co模块使用
var co = require('co');
co(gen); //co 函数返回一个 Promise 对象
co(gen).then(function (){console.log('Generator 函数执行完成');
});
(2)更好的语义。
async 和 await ,比起星号和 yield ,语义更清楚了。 async 表示函数里有异步操作, await 表示紧跟在后面的表达式需要等待结果。
(3)更广的适用性。
co 模块约定, yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。
(4)返回值是 Promise。
async 函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用 then 方法指定下一步的操作。
进一步说, async 函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而 await 命令就是内部 then 命令的语法糖。
1. 基本的 async 函数
// 定义一个异步函数
async function fetchData() {return 'Data fetched';
}// 调用异步函数
fetchData().then(data => {console.log(data); // 输出: Data fetched
});
2. 使用 await 等待 Promise
// 模拟一个异步请求函数
function getUserData() {return new Promise(resolve => {setTimeout(() => resolve({ name: 'Alice' }), 1000);});
}// 异步函数使用 await 等待 Promise
async function printUserData() {try {const userData = await getUserData();console.log(userData); // 输出: { name: 'Alice' }} catch (error) {console.error(error);}
}printUserData();
3. 错误处理
// 异步函数中的错误处理
async function riskyFunction() {try {const result = await Promise.reject('An error occurred');} catch (error) {console.error(error); // 输出: An error occurred}
}riskyFunction();
4. 链式 async 函数
async function asyncOperation() {return 'Operation completed';
}async function chainAsyncFunctions() {try {const result1 = await asyncOperation();const result2 = await asyncOperation();console.log(result1, result2); // 输出: Operation completed Operation completed} catch (error) {console.error(error);}
}chainAsyncFunctions();
5. async 函数作为事件处理函数
// 假设有一个按钮元素
const button = document.querySelector('#myButton');// 为按钮添加点击事件处理函数
button.addEventListener('click', async event => {try {const data = await fetchData();console.log(data);} catch (error) {console.error(error);}
});
6. async 函数与 Promise.all
// 异步函数返回多个 Promise
async function fetchUsers() {return ["User1", "User2", "User3"];
}async function fetchPosts() {return ["Post1", "Post2", "Post3"];
}// 使用 Promise.all 并行处理多个异步操作
async function fetchAllData() {try {const [users, posts] = await Promise.all([fetchUsers(), fetchPosts()]);console.log(users, posts); // 输出: [ 'User1', 'User2', 'User3' ] [ 'Post1', 'Post2', 'Post3' ]} catch (error) {console.error(error);}
}fetchAllData();
相关文章:
ES6 async 函数详解 (十)
async 函数是什么?一句话,它就是 Generator 函数的语法糖。 const gen function* () {const f1 yield readFile(/etc/fstab);const f2 yield readFile(/etc/shells);console.log(f1.toString());console.log(f2.toString()); };const asyncReadFile …...
【安全设备】入侵检测
一、什么是入侵检测 入侵检测是一种网络安全技术,用于监测和识别对计算机系统或网络的恶意使用行为或未经授权的访问。入侵检测系统(IDS)是实现这一目标的技术手段,其主要目的是确保计算机系统的安全,通过及时发现并报…...
07浅谈大语言模型可调节参数tempreture
浅谈temperature 什么是temperature? temperature是大预言模型生成文本时常用的两个重要参数。它的作用体现在控制模型输出的确定性和多样性: 控制确定性: temperature参数可以控制模型生成文本的确定性,大部分模型中temperatur…...
Redis数据同步
文章简单介绍基于redis-shake的redis数据同步,该工具基于每个节点同步数据,即每个主节点需同步一次,才能完成整个redis集群的数据同步。 1、redis节点操作 ### 查看redis版本 ./bin/redis-server --version### 登录redis ./bin/redis-cli -…...
快手矩阵源码,快速拥有自己的短视频矩阵
在数字化浪潮席卷全球的今天,短视频已成为内容传播的新宠,而如何高效、精准地管理多平台、多账号,实现短视频内容的快速制作与发布,是每个自媒体人都在思考的问题。快手矩阵源码,作为一款集多平台管理、多账户管理、短…...
notes for datawhale 2th summer camp NLP task1
//I wrote this note in obsidian and copied it here. The strange format in this note is due to lack of obsidian plugins. tags: AI-studyML status: done 目标:跑通baseline,体验NLP模型解决问题的流程,基本了解赛题要求,…...
攻防世界(PHP过滤器过滤)file_include
转换过滤器官方文档:https://www.php.net/manual/zh/filters.convert.php#filters.convert.iconv 这道题因为convert.base64-encode被过滤掉了,所以使用convert.iconv.*过滤器 在激活 iconv 的前提下可以使用 convert.iconv.* 压缩过滤器, 等…...
PostGIS2.4服务器编译安装
PostGIS的最新版本已经到3.5,但是还有一些国产数据库内核使用的旧版本的PostgreSQL,支持PostGIS2.4。但PostGIS2.4的版本已经在yum中找不到了,安装只能通过本地编译的方式。这里介绍一下如何在Centos7的系统上,编译部署PostGIS2.4…...
虚拟机安装Linux CENTOS 07 部署NET8 踩坑大全
首先下载centos07镜像,建议使用阿里云推荐的地址: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.59b5f5ad5Nfr0X 其实这里就已经出现第一个坑了 centos 07 /usr/lib64/ 的 libstdc.so只支持到19; GLI…...
【C++】CMake入门
CMake 是一个跨平台的构建系统生成工具,可以生成用于编译和链接应用程序的构建文件(如 Makefile 或 Visual Studio 工程文件)。 安装 CMake Windows 可以从 CMake官网 下载并安装 Windows 版本的 CMake。安装完成后,确保将 CMak…...
云WAF | 云waf保护你的网络安全
随着时代的发展,云计算与网络安全成为当今社会的热点问题。由于网络环境的日益复杂,网络安全问题日益突出,网络安全问题日益突出。近年来,各类网络安全工具与技术层出不穷,以保障用户信息及企业财产安全。云服务防火墙…...
c++初阶知识——类和对象(1)
目录 1.类和对象 1.1 类的定义 1.2 访问限定符 1.3 类域 2.实例化 2.1 实例化概念 2.2 对象大小 内存对齐规则 3.this指针 1.类和对象 1.1 类的定义 (1)class为定义类的关键字,Stack为类的名字,{}中为类的主体…...
Vue 3 组件通信全解:从基础到高级技巧
引言 Vue 3 引入了 Composition API,这为组件通信带来了新的灵活性和强大的功能。 组件通信基础 组件的定义和作用 在前端开发中,组件可以被看作是构建用户界面的独立单元。它封装了特定的功能和样式,可以被重复使用,并且可以…...
大众汽车入职SHL在线测评、英语口语、招聘笔试如何通过、考点分析|备考建议
大众汽车入职在线测验真题考点分析,通过技巧? 大众汽车集团(中国)在招聘过程中,认知能力测试是评估候选人是否适合某个职位的重要环节。候选人会收到带有线上测评链接的邮件,测评包括胜任力潜力测试(Compe…...
《植物大战僵尸杂交版》2.2:新版本体验与下载指南
作为《植物大战僵尸》系列的忠实粉丝,我最近发现了一款令人兴奋的改版游戏——《植物大战僵尸杂交版》2.2。这款游戏不仅保留了原作的经典元素,还加入了一些创新的玩法,让我忍不住想要分享给大家。 2.2版本新体验 新僵尸登场 最新版本中&am…...
7月11日学习打卡,数据结构栈
大家好呀,本博客目的在于记录暑假学习打卡,后续会整理成一个专栏,主要打算在暑假学习完数据结构,因此会发一些相关的数据结构实现的博客和一些刷的题,个人学习使用,也希望大家多多支持,有不足之…...
数据结构第20节 快速排序以及优化
快速排序是一种非常高效的排序算法,由英国计算机科学家托尼霍尔(Tony Hoare)在1960年代发明。它使用分治法(Divide and Conquer)策略来把一个序列分为较小的部分,然后递归地排序这些部分。 快速排序的基本…...
3分钟理解超键、候选键、主键
1.超键 在关系模式中,能唯一标识实体实例的任何属性集 学生(学号,姓名,性别,专业编号,年龄) 通过学号可以找到一个学生的姓名、性别、专业号、年龄,但是通过姓名不一定能找到这些…...
Centos忘记密码,重置root密码
Centos忘记密码,重置root密码 操作环境:Centos7.6 1、选择包含rescue的选项,按e进入编辑模式 首先,我们需要重启系统,进入开机引导菜单界面。在这里,我们可以看到系统的内核版本和启动参数等信息。我们需…...
Android初学者书籍推荐
书单 1.《Android应用开发项目式教程》,机械工业出版社,2024年出版2.《第一行代码Android》第二版3.《第一行代码Android》第三版4.《疯狂Android讲义》第四版5.《Android移动应用基础教程(Android Studio 第2版)》 从学安卓到用安…...
揭秘K12课堂AI转型真相:3个被90%学校忽略的PlayAI部署陷阱及72小时应急修复指南
更多请点击: https://intelliparadigm.com 第一章:PlayAI教育领域应用案例 PlayAI 作为面向教育场景的轻量级AI交互平台,已在多个教学实践中展现出显著的适配性与可扩展性。其核心优势在于无需深度编程基础即可构建个性化学习路径、实时学情…...
车载信息娱乐系统(IVI)安全渗透实战:网络、固件与CAN总线三维攻防
1. 为什么车载信息娱乐系统(IVI)正在成为安全攻防的新前线去年冬天在长三角某主机厂做嵌入式安全评估时,我遇到一个典型场景:一辆刚下线的量产SUV,中控屏在连接手机热点后,仅用23秒就完成了从Wi-Fi握手包捕…...
如何高效管理动物森友会存档:NHSE完整使用指南
如何高效管理动物森友会存档:NHSE完整使用指南 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE(Animal Crossing: New Horizons Save Editor)是一款专为《动…...
模拟电路噪声分析五大误区:从频谱密度到电阻选型的实战避坑指南
1. 引言:噪声,模拟工程师的“老朋友”与“老对手”在模拟电路设计的江湖里,噪声就像一位如影随形的“老朋友”,你永远无法彻底摆脱它,却又不得不时刻提防它。它也是我们最棘手的“老对手”,一个不小心&…...
远程办公时代,如何防止公司机密被截屏泄露?
远程办公已经成为很多企业的常态,但随之而来的信息安全问题也日益突出。其中,截屏泄露是最常见也最难防范的一种。员工可以轻易地将聊天记录、文件内容截屏保存,然后转发给他人,而企业却很难察觉和追踪。【图片1】 传统的防截屏方…...
无需贴点+760万点/秒!精度0.023mm+单站覆盖156m³!FreeScan Trak系列跟踪式激光三维扫描仪来袭
先临三维深耕高精度三维视觉技术20余年,旗下FreeScan Trak系列跟踪式激光三维扫描系统,凭借高精度、重复性稳定、无需贴点、扫描快速等核心优势,已广泛应用于汽车工业、能源重工、工程机械等诸多领域,成为全球众多制造企业质量把控…...
用 n8n 搭建自己的自动化工作流平台
用 n8n 搭建自己的自动化工作流平台分类:开源项目部署n8n 适合Webhook、邮件通知、表单处理和 API 自动化。这类主题真正跑起来并不难,难的是上线后稳定、可备份、能排错。本文按实操方式整理一套可以直接落地的流程,默认你已经会登录 Linux …...
容器资源限制
1、创建一个临时容器c1 docker run -it --namec1 --rm centos:v1监控容器的资源使用情况 docker statsmemload工具可以直接占用消耗资源 将memload工具拷贝到c1容器的opt目录下 docker cp memload-7.0-1.r29766.x86_64.rpm c1:/opt在运行的容器中安装上传的安装包 rpm -ivh /op…...
浮动油封市场深度研判:预计2032年将攀升至4.57亿美元
浮动油封,也叫机械端面密封或永久密封,是一种特殊类型的机械密封,主要由一对耐磨的金属浮封环和配套的橡胶密封圈组成,它通过橡胶圈的弹力使两个金属环端面紧密贴合、相对滑动,实现对油、水、泥沙等介质的动态密封&…...
LangChain-Chatchat 开发与应用(十) 企业级部署方案-Docker-Compose-K8s集群化实践
企业级部署方案:Docker Compose / K8s 集群化实践标签:Docker | Kubernetes | 高可用 | 生产部署 | DevOps一、从"单机玩具"到"生产系统" 前面九篇,咱们从 0 到 1 搭起了 Chatchat,做了二次开发,优…...
