Array.filter中如何正确使用Async


Posted in Javascript onNovember 04, 2020

1. 如何仅保留满足异步条件的元素

在第一篇文章中,我们介绍了 async / await 如何帮助处理异步事件,但在异步处理集合时却无济于事。在本文中,我们将研究该filter函数,它可能是支持异步函数的最直观的方法。

2. Array.filter

该filter函数仅保留通过条件的元素。它得到一个断言( predicate )函数,并且此函数返回 true / false 值。结果集合仅包含断言( predicate )返回 true 的元素。

const arr = [1, 2, 3, 4, 5];

const syncRes = arr.filter((i) => {
	return i % 2 === 0;
});
console.log(syncRes);
// 2,4

3. filter 结合 map 使用

这次的异步版本要复杂一些,它分为两个阶段。第一个通过断言函数异步地映射数组,从而生成true / false 值。然后第二步是利用第一步的结果同步 filter

Array.filter中如何正确使用Async

const arr = [1, 2, 3, 4, 5];

const asyncFilter = async (arr, predicate) => {
	const results = await Promise.all(arr.map(predicate));

	return arr.filter((_v, index) => results[index]);
}

const asyncRes = await asyncFilter(arr, async (i) => {
	await sleep(10);
	return i % 2 === 0;
});

console.log(asyncRes);
// 2,4

或单行实现:

const asyncFilter = async (arr, predicate) => Promise.all(arr.map(predicate))
.then((results) => arr.filter((_v, index) => results[index]));

Array.filter中如何正确使用Async

并发

上面的实现同时运行所有断言函数。通常,这很好,但是与所有其他功能一样,它可能会使某些资源变得过分紧张。幸运的是,由于上述实现依赖于此map,因此可以使用相同的并发控件。

4. filter 结合 reduce 使用

除了使用异步map与同步之外filter,异步reduce 也可以完成这项工作。由于它只是一个功能,因此即使没有提供相同级别的控制,结构也更加容易。

首先,从一个空数组([])开始。然后通过断言函数运行下一个元素,如果通过则将其追加到数组。如果没有,请跳过它。

Array.filter中如何正确使用Async

// concurrently
const asyncFilter = async (arr, predicate) => 
	arr.reduce(async (memo, e) =>
		await predicate(e) ? [...await memo, e] : memo
	, []);

Array.filter中如何正确使用Async

请注意,await predicate(e) 在 await memo 之前,这意味着这些将并行调用。

顺序处理

要在调用下一个谓词函数之前等待其结束,请更改await 的顺序:

// sequentially
const asyncFilter = async (arr, predicate) => 
	arr.reduce(async (memo, e) => 
		[...await memo, ...await predicate(e) ? [e] : []]
	, []);

此实现等待上一个元素,然后根据断言(...[e]或...[])的结果有条件地附加一个元素。

Array.filter中如何正确使用Async

5. 结论

虽然异步filter是可能的,但它最初的工作方式看起来很奇怪。尽管并发控制仍然可用,但与其他异步功能相比,它们需要更多的计划去控制它。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
自己动手制作jquery插件之自动添加删除行的实现
Oct 13 Javascript
jQuery中的编程范式详解
Dec 15 Javascript
很实用的js选项卡切换效果
Aug 12 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
Dec 12 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
Mar 07 Javascript
Vue.js路由vue-router使用方法详解
Mar 20 Javascript
BootStrap的两种模态框方式
May 10 Javascript
Node.js  事件循环详解及实例
Aug 06 Javascript
详解vue 单页应用(spa)前端路由实现原理
Apr 04 Javascript
vue生命周期实例小结
Aug 15 Javascript
angularJs select绑定的model取不到值的解决方法
Oct 08 Javascript
Vue实现简易翻页效果源码分享
Nov 08 Javascript
JavaScript setTimeout()基本用法有哪些
Nov 04 #Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
Nov 04 #Javascript
通过实例了解Render Props回调地狱解决方案
Nov 04 #Javascript
vant中的toast层级改变操作
Nov 04 #Javascript
vant中的toast轻提示实现代码
Nov 04 #Javascript
JavaScript快速调试的两个技巧
Nov 04 #Javascript
如何实现小程序与小程序之间的跳转
Nov 04 #Javascript
You might like
php抓取https的内容的代码
2010/04/06 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
剖析Python的Twisted框架的核心特性
2016/05/25 Python
有趣的python小程序分享
2017/12/05 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
Python异常处理操作实例详解
2018/08/28 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
python将字典内容写入json文件的实例代码
2020/08/12 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
最新大学生自我评价
2013/09/24 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
母亲节感言
2015/08/03 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
HTML+JS实现在线朗读器
2022/02/15 Javascript