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

Brad
  • 25

方法取自《高性能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)
回复
阅读 707
2 个回答

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏