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 相关文章推荐
30个最佳jQuery Lightbox效果插件分享
Apr 11 Javascript
动态加载脚本提升javascript性能
Feb 24 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
JS更改select内option属性的方法
Oct 14 Javascript
jquery 判断selection range 是否在容器中的简单实例
Aug 02 Javascript
Web打印解决方案之普通报表打印功能
Aug 29 Javascript
JavaScript中return用法示例
Nov 29 Javascript
Vue编写多地区选择组件
Aug 21 Javascript
vue页面离开后执行函数的实例
Mar 13 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
vue 自定义组件的写法与用法详解
Mar 04 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
PHP微商城开源代码实例
2019/03/27 PHP
php时间戳转换代码详解
2019/08/04 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
Python 中如何写注释
2020/08/28 Python
python实现简单的五子棋游戏
2020/09/01 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
产品质量承诺书
2014/03/27 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
师德演讲稿范文
2014/05/06 职场文书
积极心理学课程心得体会
2016/01/22 职场文书
python基础之错误和异常处理
2021/10/24 Python
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android