You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
importMagixfrom'magix5';let{task,taskFinale}=Magix;letprocess=(div,deg)=>{div.style.transform=`rotate(${deg%360}deg)`;letbound=div.getBoundingClientRect();div.innerHTML=`x:${bound.x},y:${bound.y},width:${bound.width},height:${bound.height}`;};letdivs=document.querySelectAll('div');letdeg=0;for(letdivofdivs){task(process,div,deg++);}console.log('all div push to task');//这里仅仅是把任务安排上,尚未执行完所有的taskawaittaskFinale();console.log('all task finished');//所有task执行完成
在浏览器环境下,
DOM
的操作尤其费时间,所以才会有各种各样的库和框架以求最小化的变更来操作DOM
提升效率。但是在条件一定的情况下,就是要操作许多费时的
DOM
我们该如何避免浏览器卡死或卡顿呢?假如页面上有
10000
个div
,我们需要遍历它们并旋转,再把外接矩形的信息放在div
内部,我们可能这样写我们进行性能放大来看:假如每个
div
旋转并获取外接矩形所需要的时间是1ms
,那么完成整个操作就需要10000ms
,在这个时间内,浏览器是卡住的,这段时间内用户无法操作浏览器。我们该如何即快速完成
DOM
操作又不卡浏览器呢?其实在单线程的
DOM
操作上,我们必须去做转换才能解决问题,否则是无解的。我们需要做的第一件事就是把操作进行方法封装,比如这样
这样转换之后依然会有
10000ms
的卡住时间。那么接下来就需要使用magix5
提供的task
方法了,如下我们只需要把原来的
process(div, deg++);
换成task(process, div, deg++);
,magix5
内部会自动根据浏览器性能,最大化的去异步执行process
方法,不卡浏览器。在
magix5
中提供2
种优先级的任务,正常优先级的task
及低优先级的lowTask
。以上代码会输出
当同时存在
task
与lowTask
任务时,lowTask
始终在最后被执行,您可以把一些低优先级且耗时的任务放在lowTask
里。那么如何知道
task
与lowTask
执行完了呢?我们可以直接使用
taskFinale
与lowTaskFinale
这2个方法,如下lowTaskFinale
与taskFinale
相同,只不过它是确保所有低优先级的任务完成。如果要确保所有任务完成,可使用
lowTaskFinale
,如扩展
除了上述的
task, lowTask, taskFinale, lowTaskFinale
这4
个核心的方法外,还有一个扩展方法taskIdle
,在任务队列空闲至少多少毫秒后执行,如在给定时间内,没有要执行的
task
才会执行后面的代码,否则只要有任务进来,taskIdle
就会继续挂起。需要注意的是这些方法是全局共用的,即一个
view
中调用task
,也会影响其它view
中task
调用的执行和回调时间,不过这些只是先后顺序而已,不会影响最终结果。The text was updated successfully, but these errors were encountered: