Javascript使用定时器来处理数组和分割任务实现异步

使用定时器来处理数组

//参数: 待处理的数组, 对每一个数组项调用的函数, 处理完成后运行的回调函数.
function processArray(items, process, callback) {
    var todo = items.concat();

    setTimeout(function() {
        process(todo.shift());

        if (todo.length > 0) {
            setTimeout(arguments.callee, 25);
        } else {
            callback(items);
        }
    }, 25);
}

例子:

var items = [1,2,3,4,5];

function output(value) {
    console.log(value);
}

processArray(items, output, function(){
    console.log("Done!");
})

提示:

使用定时器处理数组的副作用是处理数组的总时长增加了. 这是因为在每一个条目处理完成之后UI线程会空闲出来, 并且在下一条目开始处理之前会有一段延时, 尽管如此, 为避免锁定浏览器给用户带来的体验, 这种取舍是有必要的.


分割任务

//参数: 由待执行函数组成的数组, 为每一个函数运行时提供参数的数组, 以及处理结束时调用的回调函数
function multistep(steps, args, callback) {
    var tasks = steps.concat();

    setTimeout(function() {
        //执行下一个任务
        var task = tasks.shift();
        task.apply(null, args || []);

        //检查是否还有其他任务
        if (tasks.length > 0) {
            setTimeout(arguments.callee, 25);
        } else {
            callback();
        }
    }, 25);
}

例子:

function saveDocument(id) {
    var tasks = [openDocument, writeText, closeDocument, updateUI];
    multistep(tasks, [id], function(){
        alert("Done")
    };
}

提示:

注意multistep( )的第二个参数必须为数组, 它创建时只包含一个id. 正如数组处理那样, 使用此函数的前提条件: 任务可以异步处理而不影响用户体验或造成相关代码错误.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值