使用定时器替代循环处理数组?

发布于 2022-09-12 04:19:36 字数 403 浏览 25 评论 0

方法取自《高性能JavaScript》

  1. 是不是就是用递归替代循环?
  2. 这种方法常用吗,或者有什么更好的方法吗?

实例:

`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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

執念 2022-09-19 04:19:36

1、是不是就是用递归替代循环
看起来是,实际上不是,变成了递归只是表象,不是这里的关键。实际上这里所做的优化是把一个时间复杂度高的操作分割成多次进行,防止这种时间复杂度高的操作长时间占用主线程,导致页面卡顿的问题。

2、这种方法常用吗,或者有什么更好的方法吗?
这种其实更偏向于理念,一些库或者框架底层实现会用(比如 React 的 fiber 就跟这个很类似),但是普通开发中用的不算多,这种时间复杂度高的操作不常见,大部分也可以仍给 worker 处理。

等风来 2022-09-19 04:19:36

其实就是把耗时操作分到不同帧去执行。
更好的办法有window.requestAnimationFrame、webworker等。

实际业务中基本用不到 因为通常没有那么大的数据量需要这么操作的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文