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();

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

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

相关文章

项目管理工具评测:2024年国内外最顶级的10款项目管理工具排行

国内外涌现出众多优秀的项目管理工具,它们各自在功能、易用性、集成能力等方面展现出独特优势。以下是国内外顶级的10款项目管理工具: 一、进度猫 推荐理由:进度猫以其直观的任务管理和进度跟踪功能,成为许多团队和项目的首选…

MybatisPlus 使用教程

MyBatisPlus使用教程 文章目录 MyBatisPlus使用教程1、使用方式1.1 引入依赖1.2 构建mapper接口 2、常用注解2.1 TableName2.2 TableId2.3 TableField MyBatisPlus顾名思义便是对MyBatis的加强版,但两者本身并不冲突(只做增强不做改变): 引入它并不会对原…

老年实训室的技能大赛介绍

在当今老龄化社会的背景下,老年护理和服务的质量愈发受到关注。为了提升相关人员的专业技能和服务水平,老年实训室的技能大赛应运而生。 老年实训室的技能大赛通常涵盖了多个方面的考核内容,旨在全面检验参赛者在老年护理与服务领域的综合能力…

ES6 Iterator 与 for...of 循环(五)

Iterator 特性: 统一的接口:无论是数组、字符串还是自定义对象,只要它们有默认的迭代器,就可以使用 for…of 循环进行遍历。可迭代对象:具有 [Symbol.iterator] 属性的对象被认为是可迭代的。[Symbol.iterator] 是一个…

FastAPI 学习之路(三十九)对开发接口进行测试

概况 对于开发好的接口需要进行测试之后才能发布。当我们在开发的时候,没有提前测试,我们也要对我们自己的接口进行测试,那么FastApi自身也带有针对开发的接口进行测试的功能。我们看下FastApi官方给我们提供了什么样的支持。 接口还是基于…

笔记本硬盘数据恢复的6种方法!简单易懂

可以从笔记本电脑硬盘恢复已删除的数据吗? “我不小心删除了笔记本电脑硬盘上的重要数据。请问我可以在笔记本电脑硬盘上恢复已删除的数据吗?如果可以,我应该怎么做才能恢复数据呢?” 很多笔记本电脑用户可能会不小心地从电脑中…

线程冲突案例演示

我们以银行取款经典案例来演示线程冲突现象。 银行取款的基本流程可以分为如下几个步骤。 (1)用户输入账户、密码,系统判断用户的账户、密码是否匹配。 (2)用户输入取款金额。 (3)系统判断账…

JavaSE 面向对象程序设计进阶 IO 练习读取多个对象

练习读取多个对象 用序列化流将对象写入文件 import java.io.*; import java.nio.charset.Charset;public class Main {public static void main(String[] args) throws IOException, ClassNotFoundException {//序列化多个对象Person p1new Person("多多", 男,20)…

梧桐数据库:数据库产品中的自然语言语义分析技术

数据库产品中的自然语言语义分析技术是一项重要的自然语言处理技术,它涉及对自然语言文本进行深度理解和分析,从而识别文本中的实体、关系、情感等语义信息,并将这些信息转化为计算机可以理解和处理的形式。 一、自然语言语义分析技术的定义…

蓝牙 - Terminal I/O Service Specification

1, Introduction 1.1, Scope 通过该服务,终端 I/O 客户端设备可连接终端 I/O 服务器设备并与之交互,从而实现串行数据和 GPIO 状态信息的双向交流。 终端 I/O 服务公开本地 UART 数据和本地 GPIO 状态变化,并允许 GATT 客户向 GATT 服务器传…

Elasticsearch 基础查询语句汇总

Elasticsearch 基础查询语句汇总 准备条件指定id查询一指定id查询二指定多个id查询区间查询模糊查询多字段查询分页查询查询总数量 准备条件 以下查询操作都基于索引crm_clue来操作,索引已经建过了,本文主要讲Elasticsearch查询语句,下面开始…

DP学习——设计模式代码采集

学而时习之,温故而知新。 c++代码 1111https://blog.csdn.net/xushuilong/article/details/106962825 22222

电商之订单价税拆分实现方案

文章目录 案例数据实现思路1、计算出平均金额2、计算每个商品的金额 实现方案1、订单 order 实体2、订单明细 orderDetail 实体3、实现类4、测试启动5、实现结果 在做电商项目的时候,会遇到要对订单明细进行纳税金额拆分,即将税额拆分到每个商品上&#…

Android 自定义Edittext 和TextView 提示文字和填入内容不同的粗细组件

近期项目中又EditText 以及TextView 这两个组件需要用到提示文字 以及 填入文字要保持不同的粗细程度,所以记录一下 首先 是EditText 组件的自定义 BLEditText 继承的这个组件是一个三方的组件,可以在很大程度上减少drawable的编写,有兴趣的可以去相关的Git去看一下 点击查看,…

[leetcode]maximum-binary-tree 最大二叉树

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return construct(nums, 0, nums.size() - 1);}TreeNode* construct(const vector<int>& nums, int left, int right) {if …

人工智能算法工程师(中级)课程4-sklearn机器学习之回归问题与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程4-sklearn机器学习之回归问题与代码详解。回归分析是统计学和机器学习中的一种重要方法&#xff0c;用于研究因变量和自变量之间的关系。在机器学习中&#xff0c;回归算法被广泛应用于…

软件开发23种设计模式

一、设计模式分类 软件开发的23种模式&#xff0c;主要分类有创建型模式&#xff0c;结构型模式&#xff0c;行为型模式三种&#xff0c;相关分类如下&#xff1a; 设计模式是一种面向对象编程的思想&#xff0c;它是由Gamma等人在《设计模式&#xff1a;可复用面向对象软件的…

中新青年领导人交流营走进李良济,零距离感受中医药文化的魅力

7月8日晚&#xff0c;2024中新青年领导人交流营在苏州正式启动。该交流营主题为“青年创业和可持续发展”&#xff0c;由中华全国青年联合会、新加坡全国青年理事会主办&#xff0c;江苏省、北京市青年联合会与苏州市人民政府承办&#xff0c;苏州市青年联合会与苏州工业园区管…

k8s核心操作_Ingress统一网关入口_域名访问配置_ingress域名转发规则配置_根据域名访问不同服务---分布式云原生部署架构搭建026

上一节我们已经把 ingress 安装好了可以看到 kubectl get svc -A 可以看到 出现了ingress-nginx 的service,在ingre-nginx这个命名空间中,有两个,一个是 ingress-nginx-controller 开了两个一个是对应http,一个对应https 一个是 ingress-nginx-controller-admission 对…

unordered_map和set

前言&#xff1a;本篇文章继续分享新的容器unordered_map和set。前边我们分享过map和set&#xff0c;其底层为红黑树&#xff0c;而unordered_map和set的底层则为哈希表&#xff0c;因此在unordered_map和set的实现中&#xff0c;我们可以效仿许多在map和set的中就分享过的一些…