利用定时器进行任务分割

stargaga 2011-03-30
程序分割:将程序分割为独立的一系列子任务,把每一个任务用定时器分开避免影响正常的UI进程。引自《高性能javascript一书》,此函数可以使用的前提是,任务可以异步处理而不影响用户体验或造成相关代码错误。

code:


function multistep(steps, args, callback)
{
    var tasks = steps.concat(); //concat函数赋值原数组,返回一个该数组的副本
    setTimeout(function () {
        
        var task = tasks.shift();
        task.apply(null, args || []); //运用apply函数执行数组顶端的函数
        
        //检查是否还有未处理的函数
        if(tasks.length > 0 )
            setTimeout(arguments.callee, 25); //用arguments.callee做递归调用
        else
        {
            callback(); //用于函数执行完成后的返回函数
        }
    }, 25);
}


    其中的arguments.callee返回自身函数体,可用arguments.callee.toString()查看返回值。
例子:
var documentOp = function ( id ) {
    var tasks = [openDocument, writeText, closeDocument, updateUI];
    multistep(tasks, [id], function () {
        alert("文档处理完毕!");
    });
}; //需要注意的是multistep()第二个参数必须是数组形式,因为函数接收的参数形式即为数组


jackra 2011-04-01
结构好乱....
如此的管道调用会导致回调函数的逆序调用?为什么要如此设计呢?
stargaga 2011-04-01
不会引起回调函数的逆序调用的,这个是用定时器进行任务分割,待“管道”中的函数执行完毕后才进行回调函数的调用。关于这个设计的目的,是为了让javascript不阻碍浏览器的UI进程。

aokihu 2011-06-20
异步的话也可以用XMLHttpRequest实现啊,这个是异步调取的,可以设置onerror的时候触发制定的函数;
现在html5出来了,也可以用worker实现,不过好像性能影响也很大
BetaRabbit 2011-06-21
arguments.callee这个东西很影响性能,貌似ES5里面已经被废除了。。。
stargaga 2011-06-22
aokihu 写道
异步的话也可以用XMLHttpRequest实现啊,这个是异步调取的,可以设置onerror的时候触发制定的函数;
现在html5出来了,也可以用worker实现,不过好像性能影响也很大


我原来的想法也是想在浏览器的环境下,分时跑循环,刚才看了一下worker,好东西,但是对性能影响很大哈。
谢谢回复~大家一起讨论哈
Global site tag (gtag.js) - Google Analytics