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变量声明详解
Nov 27 Javascript
jQuery拖拽插件gridster使用指南
Apr 21 Javascript
jQuery实现带水平滑杆的焦点图动画插件
Mar 08 Javascript
AngularJS入门教程之Scope(作用域)
Jul 27 Javascript
js实现统计字符串中特定字符出现个数的方法
Aug 02 Javascript
学习vue.js计算属性
Dec 03 Javascript
jquery仿京东商品放大浏览页面
Jun 06 jQuery
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 jQuery
微信小程序时间轴实现方法示例
Jan 14 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
Sep 10 Javascript
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 jQuery
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 编写的日历
2006/10/09 PHP
laravel学习教程之存取器
2016/07/30 PHP
php 常用的系统函数
2017/02/07 PHP
javascript new fun的执行过程
2010/08/05 Javascript
JQuery魔力之$("tagName")与selector
2012/03/05 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
RequireJs的使用详解
2017/02/19 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
小程序中的箭头函数的具体使用
2020/06/19 Javascript
Python列表和元组的定义与使用操作示例
2017/07/26 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
Python数据库小程序源代码
2019/09/15 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
2020/03/14 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
Java语言的优势
2015/01/10 面试题
大学生写自荐信的技巧
2014/01/08 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
期中考试反思800字
2014/05/01 职场文书
希特勒的演讲稿
2014/05/23 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
教师节主题班会方案
2015/08/17 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python