javascript - ES6:过滤数组以不冻结 UI
问题描述
我正在尝试过滤一个巨大的数组。不幸的是,数组太大以至于 UI 冻结。这就是为什么我试图以块的形式执行过滤,中间有一个超时,以便 UI 可以加载。
出于演示目的,我采用“巨大”数组[1,2,3,4,5]
并返回可被二整除的元素。
我已经尝试过了,但它不起作用:
[1,2,3,4,5].filter(async (x) => {
// wait 1 sec after each element to filter
await new Promise(resolve => setTimeout(resolve, 1000));
return x % 2 === 0;
});
任何想法如何过滤一个大数组以使 UI 不会冻结?
解决方案
您可以以异步方式用过滤后的元素填充空数组,需要注意的是顺序可能与原始数组不同:
var ret = []
var promiseArray = [1,2,3,4,5].map( async x => {
await new Promise(resolve => {setTimeout(resolve, 1000)})
if (x % 2 === 0) {
ret.push(x)
}
})
Promise.all(promiseArray).then(()=> {console.log(ret)})
推荐阅读
- sql - Oracle SQL:提取两个字符之间的文本
- javascript - 对组件类函数的角度 ng-change 调用未触发
- javascript - 带有 querySelectorAll 的第一个待办事项列表
- node.js - 有没有办法在没有公共 IP 的情况下托管 node.js 服务器?
- owl - 在 Protege 中添加限制
- yii2 - 从 yii2 中的动态表单按钮调用 Javascript
- ios - 获取 Swift 子目录中资源的所有 URL
- html - 隐藏溢出不适用于图像
- java - 从本地存储库获取最新版本的 jar
- amazon-web-services - AWS CloudWatch Events 在 STS 角色上触发 SNS 为跨账户代入