7个Js async/await高级用法

前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

7个Js async/await高级用法

JavaScript的异步编程已经从回调(Callback)演进到Promise,再到如今广泛使用的async/await语法。后者不仅让异步代码更加简洁,而且更贴近同步代码的逻辑与结构,大大增强了代码的可读性与可维护性。在掌握了基础用法之后,下面将介绍一些高级用法,以便充分利用async/await实现更复杂的异步流程控制。

1. async/await与高阶函数

当需要对数组中的元素执行异步操作时,可结合async/await与数组的高阶函数(如mapfilter等)。

// 异步过滤函数
async function asyncFilter(array, predicate) {const results = await Promise.all(array.map(predicate));return array.filter((_value, index) => results[index]);
}// 示例
async function isOddNumber(n) {await delay(100); // 模拟异步操作return n % 2 !== 0;
}async function filterOddNumbers(numbers) {return asyncFilter(numbers, isOddNumber);
}filterOddNumbers([1, 2, 3, 4, 5]).then(console.log); // 输出: [1, 3, 5]

2. 控制并发数

在处理诸如文件上传等场景时,可能需要限制同时进行的异步操作数量以避免系统资源耗尽。

async function asyncPool(poolLimit, array, iteratorFn) {const result = [];const executing = [];for (const item of array) {const p = Promise.resolve().then(() => iteratorFn(item, array));result.push(p);if (poolLimit <= array.length) {const e = p.then(() => executing.splice(executing.indexOf(e), 1));executing.push(e);if (executing.length >= poolLimit) {await Promise.race(executing);}}}return Promise.all(result);
}// 示例
async function uploadFile(file) {// 文件上传逻辑
}async function limitedFileUpload(files) {return asyncPool(3, files, uploadFile);
}

3. 使用async/await优化递归

递归函数是编程中的一种常用技术,async/await可以很容易地使递归函数进行异步操作。

// 异步递归函数
async function asyncRecursiveSearch(nodes) {for (const node of nodes) {await asyncProcess(node);if (node.children) {await asyncRecursiveSearch(node.children);}}
}// 示例
async function asyncProcess(node) {// 对节点进行异步处理逻辑
}

4. 异步初始化类实例

在JavaScript中,类的构造器(constructor)不能是异步的。但可以通过工厂函数模式来实现类实例的异步初始化。

class Example {constructor(data) {this.data = data;}static async create() {const data = await fetchData(); // 异步获取数据return new Example(data);}
}// 使用方式
Example.create().then((exampleInstance) => {// 使用异步初始化的类实例
});

5. 在async函数中使用await链式调用

使用await可以直观地按顺序执行链式调用中的异步操作。

class ApiClient {constructor() {this.value = null;}async firstMethod() {this.value = await fetch('/first-url').then(r => r.json());return this;}async secondMethod() {this.value = await fetch('/second-url').then(r => r.json());return this;}
}// 使用方式
const client = new ApiClient();
const result = await client.firstMethod().then(c => c.secondMethod());

6. 结合async/await和事件循环

使用async/await可以更好地控制事件循环,像处理DOM事件或定时器等场合。

// 异步定时器函数
async function asyncSetTimeout(fn, ms) {await new Promise(resolve => setTimeout(resolve, ms));fn();
}// 示例
asyncSetTimeout(() => console.log('Timeout after 2 seconds'), 2000);

7. 使用async/await简化错误处理

错误处理是异步编程中的重要部分。通过async/await,可以将错误处理的逻辑更自然地集成到同步代码中。

async function asyncOperation() {try {const result = await mightFailOperation();return result;} catch (error) {handleAsyncError(error);}
}async function mightFailOperation() {// 有可能失败的异步操作
}function handleAsyncError(error) {// 错误处理逻辑
}

通过以上七个async/await的高级用法,开发者可以在JavaScript中以更加声明式和直观的方式处理复杂的异步逻辑,同时保持代码整洁和可维护性。在实践中不断应用和掌握这些用法,能够有效地提升编程效率和项目的质量。

 前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

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

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

相关文章

被央视报道过的AIGC产品-贝塔创作(BetaCreator)使用指南

产品地址&#xff1a;betacreator.com 真人图 人台图 商品图 商品变色 建议使用浅色服装进行变色&#xff0c;效果更好 如果没有浅色服装&#xff0c;可以先把服装颜色变为白色

视频剪辑必备的6个免费素材网站

视频剪辑需要用到很多音效、视频、图片等素材&#xff0c;下面我就分享几个剪辑必备的免费视频素材网站&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多视频、…

2697. 字典序最小回文串

我的解法&#xff1a; 将字符串反转开始比较。 C class Solution { public:string makeSmallestPalindrome(string s) {string a s, b s;reverse(b.begin(), b.end());int n s.size();for (int i 0; i < n; i) {if (a[i] ! b[i]) {a[i] b[i] min(a[i], b[i]);a[n - …

python学习:浅拷贝与深拷贝详解

copy 一、 & is二、浅拷贝 & 深拷贝(一)、浅拷贝(二)、深拷贝 三、问题 一、’ ’ & ‘is’ ’ 和is是python对象比较常用的两种方式,简单来说,‘ ‘操作符比较对象之间的值是否相等,如 a b 而’is’操作符比较的是对象的身份标识是否相等,即它们是否是同一个…

Linux系统解决“Key was rejected by service”

Linux系统下加载驱动模块出现如上错误提示的原因为&#xff1a;此驱动未经过签名。 方法一、关闭Secure Boot 如果是物理机&#xff0c;需要开机进入BIOS&#xff0c;找到“Secure Boot”的选项&#xff0c;然后关闭。 如果是虚拟机&#xff0c;可以打开虚拟设置&#xff0c…

arthas(阿尔萨斯) 使用问题汇总

arthas 使用问题汇总 1、arthas查看不到java进程1.1、首先要保证你的环境变量配置是正确的1.2、jps 也看不到java进程 2、离线安装问题3、如何使用arthas 1、arthas查看不到java进程 1.1、首先要保证你的环境变量配置是正确的 java -verionjavac -version 都能正常显示 [rootd…

平面上点到直线的距离

文章目录 平面上点到直线的距离 平面上点到直线的距离 设坐标平面上有点 P ( x 1 , y 1 ) P(x_1,y_1) P(x1​,y1​)和直线 l : A x B y C 0 l:AxByC0 l:AxByC0, A , B A,B A,B不全为0点 P P P到直线 l l l的的距离的算法推导如下 作直线 m m m通过点 P ( x 1 , y 1 ) P(x_1…

上传文件Dubbo报错: Data length too large: xxxxx, max payload: 8388608

一、场景&#xff1a; 服务端是微服务&#xff0c;服务A有个上传图片的功能&#xff0c;需求是限制大小为10M&#xff0c;用户通过客户端把图片上传到服务A&#xff0c;A再调用服务B把文件上传至阿里oss。 功能实际上很简单&#xff0c;实现的代码如下&#xff1a; 服务A的Con…

快速准确翻译文件夹名:英文翻译成中文,文件夹批量重命名的技巧

在处理大量文件夹时&#xff0c;可能会遇到要将英文文件夹名翻译成中文的情况。同时也可能要批量重命名这些文件夹。今天一起来看下云炫文件管理器如何快速准确翻译文件夹名&#xff0c;进行批量重命名的技巧。 下图是文件夹名翻译前后的效果图。 英文文件夹名批量翻译成中文…

3Dmax快捷键大全,让你的创作飞起来!附赠3dmax工具箱插件,快来收藏吧!

你是否曾经在3Dmax中因为繁琐的操作而感到困扰&#xff1f; 今天&#xff0c;我将为大家带来一份精心整理的3Dmax常用快捷键宝典&#xff0c;让你在建模、材质编辑、动画制作等各个方面都能游刃有余&#xff0c;让你的创作飞起来&#xff01;&#xff01; &#x1f4a1; 选择与…

7-1 jmu-python-输入输出-处理不定行输入

7-1 jmu-python-输入输出-处理不定行输入 分数 15 作者 郑如滨 单位 集美大学 处理一段文字&#xff08;可能有很多行&#xff0c;行数不确定&#xff09;&#xff0c;输出每行包含的单词数(单词之间以空格或多个空格分隔)。 注意&#xff1a;处理的时候要忽略掉空行或者空格行…

27. 深度学习进阶 - 为什么RNN

文章目录 一个柯基的例子为什么RNN or CNN Hi&#xff0c;你好。我是茶桁。 这节课开始&#xff0c;我们将会讲一个比较重要的一种神经网络&#xff0c;它对应了咱们整个生活中很多类型的一种问题结构&#xff0c;它就是咱们的RNN网络。 咱们首先回忆一下&#xff0c;上节课咱…

【计算机网络】TCP|IP协议

目录 前言 什么是TCP/IP协议&#xff1f; TCP/IP协议的层次结构 TCP/IP协议的工作原理 TCP/IP协议的重要性 结语 前言 TCP/IP协议是当今互联网世界中最重要的网络协议之一&#xff0c;它是网络通信的基石&#xff0c;为数据在网络中的传输提供了可靠性和有效性。本文将深…

前段js解决文本框录入保留多位小数设置

自己在前段开发所遇到的问题整理了一下&#xff0c;供大家参考&#xff1a; 原本的代码&#xff1a;<input type"text" class"form-control" id"yfprice" style"text-align:right;" value"0" οnkeyup"valuevalue.…

python编程需要的电脑配置,python编程用什么电脑

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python编程对笔记本电脑配置的要求&#xff0c;python编程对电脑配置的要求有哪些&#xff0c;现在让我们一起来看看吧&#xff01; 学习python编程需要什么配置的电脑 简单的来讲&#xff0c;Python的话普通电脑就可以…

SAP UI5 walkthrough step1 hello word

这里我用的VS Studio 来进行本地化学习 关于SAP UI5是啥&#xff0c;我就不再赘述了&#xff0c;另外还有VS Studio 的安装&#xff0c;请提前做好准备 下面我们直接进入正文 1.首先在你的本地新建一个文件夹&#xff0c;此处我命名为&#xff1a;walkthrough 2.在VS中打开…

​fractions --- 分数​

源代码 Lib/fractions.py fractions 模块支持分数运算。 分数实例可以由一对整数&#xff0c;一个分数&#xff0c;或者一个字符串构建而成。 class fractions.Fraction(numerator0, denominator1) class fractions.Fraction(other_fraction) class fractions.Fraction(flo…

【数据结构与算法】JavaScript实现图结构

文章目录 一、图论1.1.图的简介1.2.图的表示邻接矩阵邻接表 二、封装图结构2.1.添加字典类和队列类2.2.创建图类2.3.添加顶点与边2.4.转换为字符串输出2.5.图的遍历广度优先搜索深度优先搜索 2.6.完整实现 一、图论 1.1.图的简介 什么是图&#xff1f; 图结构是一种与树结构…

正则表达式的规则

文章目录 一、&#x1f94f;正则表达式的简述1、&#x1f9ff;什么是正则表达式2、&#x1f9eb;正则表达式特点 二、&#x1f30a;正则表达式的规则三、&#x1f3af;常用的正则表达式⚛️正则表达式语法 一、&#x1f94f;正则表达式的简述 1、&#x1f9ff;什么是正则表达式…

Java中的反射

反射 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c; Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 反射相关的概念 2. 反射的…