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 相关文章推荐
srcElement表格样式
Sep 03 Javascript
javascript 设计模式之单体模式 面向对象学习基础
Apr 18 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
Dec 12 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
Jun 24 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
Oct 11 Javascript
关于JavaScript作用域你想知道的一切
Feb 04 Javascript
JS动态插入并立即执行回调函数的方法
Apr 21 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 Javascript
基于vue中解决v-for使用报红并出现警告的问题
Mar 03 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
Sep 12 Javascript
JS实现网站吸顶条
Jan 08 Javascript
微信小程序用户登录和登录态维护的实现
Dec 10 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
PHP通过COM使用ADODB的简单例子
2006/12/31 PHP
php桌面中心(四) 数据显示
2007/03/11 PHP
PHP学习之整理字符串
2011/04/17 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
javascript数组去掉重复
2011/05/12 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
2017/03/15 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
Python Web服务器Tornado使用小结
2014/05/06 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
python读写文件write和flush的实现方式
2020/02/21 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
北京天润融通.net面试题笔试题
2012/02/20 面试题
Servlet方面面试题
2016/09/28 面试题
毕业生找工作的自我评价
2013/10/18 职场文书
感恩的演讲稿
2014/05/06 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
项目合作意向书
2015/05/08 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android