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 相关文章推荐
JQuery中的$.getJSON 使用说明
Mar 10 Javascript
jquery遍历select元素(实例讲解)
Dec 31 Javascript
JavaScript通过join函数连接数组里所有元素的方法
Mar 20 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
JavaScript操作URL的相关内容集锦
Oct 29 Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 Javascript
angular2倒计时组件使用详解
Jan 12 Javascript
微信小程序实现漂亮的弹窗效果
May 26 Javascript
VUE基于NUXT的SSR 服务端渲染
Nov 30 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
May 12 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
Aug 07 Javascript
jQuery冲突问题解决方法
Jan 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小程序自动提交到自助友情连接
2009/11/24 PHP
ThinkPHP之import方法实例详解
2014/06/20 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
基于Jquery的简单&简陋Tabs插件代码
2010/02/09 Javascript
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
javascript中的隐式调用
2018/02/10 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
python类定义的讲解
2013/11/01 Python
Python写的英文字符大小写转换代码示例
2015/03/06 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
美国温暖商店:The Warming Store
2018/12/15 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
说出数据连接池的工作机制是什么?
2013/04/19 面试题
EntityManager都有哪些方法
2013/11/01 面试题
七一表彰活动方案
2014/01/18 职场文书
2014年会计工作总结
2014/11/27 职场文书
在校证明模板
2015/06/17 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
Python合并多张图片成PDF
2021/06/09 Python
Go语言grpc和protobuf
2022/04/13 Golang