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 相关文章推荐
强制设为首页代码
Jun 19 Javascript
js实现的日期操作类DateTime函数代码
Mar 16 Javascript
一些主流JS框架中DOMReady事件的实现小结
Feb 12 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
Oct 18 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
Oct 23 Javascript
学习JavaScript设计模式之单例模式
Jan 19 Javascript
js发送短信倒计时的简单实现方法
Sep 08 Javascript
微信小程序实现登录页云层漂浮的动画效果
May 05 Javascript
全面解析Node.js 8 重要功能和修复
Jun 02 Javascript
详谈js原型继承的一些问题
Sep 06 Javascript
uni-app如何实现增量更新功能
Jan 03 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
Apr 04 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 数组的指针操作实现代码
2011/02/08 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
php中 $$str 中 "$$" 的详解
2015/07/06 PHP
PHP之预定义接口详解
2015/07/29 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
Javascript Math对象
2009/08/13 Javascript
uploadify 3.0 详细使用说明
2012/06/18 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
python基于ID3思想的决策树
2018/01/03 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
美国智能家居专家:tink
2019/06/04 全球购物
新电JAVA笔试题目
2014/08/31 面试题
综治维稳工作汇报
2014/10/27 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
休学证明范本
2015/06/19 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
vue ref如何获取子组件属性值
2022/03/31 Vue.js