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 选择器引擎sizzle浅析
Feb 06 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
jQuery找出网页上最高元素的方法
Mar 20 Javascript
轻松实现jquery手风琴效果
Jan 14 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
jquery对象与DOM对象转化
Feb 08 Javascript
详解React之key的使用和实践
Sep 29 Javascript
vue-cli3全面配置详解
Nov 14 Javascript
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
Vue结合路由配置递归实现菜单栏功能
Jun 16 Javascript
小程序实现多个选项卡切换
Jun 19 Javascript
微信小程序实现点击页面出现文字
Sep 21 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
优化使用mysql存储session的php代码
2008/01/10 PHP
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
javascript 事件处理程序介绍
2012/06/27 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
Python hashlib模块实例使用详解
2019/12/24 Python
Python模块 _winreg操作注册表
2020/02/05 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
类和结构的区别
2012/08/15 面试题
顶撞领导检讨书
2014/01/29 职场文书
超市采购员岗位职责
2014/02/01 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
村委会贫困证明范本
2014/09/17 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
教师工作能力自我评价
2015/03/04 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
Python中的变量与常量
2021/11/11 Python