使用定时器替代循环处理数组?
方法取自《高性能JavaScript》
- 是不是就是用递归替代循环?
- 这种方法常用吗,或者有什么更好的方法吗?
实例:
`for(let i = 0; i < item.length; i++) {
process(item[i])
}`
<=>
let todo = item.concat();
setTimeout(() => {
process(todo.shift());
if(todo.length > 0) {
setTimeout(arguments.callee, 25)
}else {
callback(item)
}
}, 25)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
1、是不是就是用递归替代循环
看起来是,实际上不是,变成了递归只是表象,不是这里的关键。实际上这里所做的优化是把一个时间复杂度高的操作分割成多次进行,防止这种时间复杂度高的操作长时间占用主线程,导致页面卡顿的问题。
2、这种方法常用吗,或者有什么更好的方法吗?
这种其实更偏向于理念,一些库或者框架底层实现会用(比如 React 的 fiber 就跟这个很类似),但是普通开发中用的不算多,这种时间复杂度高的操作不常见,大部分也可以仍给 worker 处理。
其实就是把耗时操作分到不同帧去执行。
更好的办法有window.requestAnimationFrame、webworker等。
实际业务中基本用不到 因为通常没有那么大的数据量需要这么操作的。