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 23 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
Dec 15 Javascript
JavaScript立即执行函数的三种不同写法
Sep 05 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
Aug 10 Javascript
自制微信公众号一键排版工具
Sep 22 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
对angularJs中自定义指令replace的属性详解
Oct 09 Javascript
vue实现动态显示与隐藏底部导航的方法分析
Feb 11 Javascript
vue-property-decorator用法详解
Dec 12 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
Feb 15 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
Jul 16 Javascript
Vue如何实现组件间通信
May 15 Vue.js
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的日期与时间函数技巧
2008/04/24 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
对numpy中向量式三目运算符详解
2018/10/31 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
python实现网页自动签到功能
2019/01/21 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
python 一维二维插值实例
2020/04/22 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
大学生个人先进事迹材料范文
2014/05/03 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
Javascript之datagrid查询详解
2021/09/15 Javascript
Vue监视数据的原理详解
2022/02/24 Vue.js