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 相关文章推荐
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
jquery简单图片切换显示效果实现方法
Jan 14 Javascript
JavaScript获取当前网页最后修改时间的方法
Apr 03 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
jQuery代码实现表格中点击相应行变色功能
May 09 Javascript
基于js实现二级下拉联动
Dec 17 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
Nov 21 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
vue.js实现的经典计算器/科学计算器功能示例
Jul 11 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
Oct 09 Javascript
JavaScript实现答题评分功能页面
Jun 24 Javascript
vue动态合并单元格并添加小计合计功能示例
Nov 26 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
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
js函数的引用, 关于内存的开销
2012/09/17 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
Vuex简单入门
2017/04/19 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
python离线安装外部依赖包的实现
2020/02/13 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
年级组长自我鉴定
2014/02/22 职场文书
中考学习决心书
2015/02/04 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python