среда, 5 марта 2014 г.

Асинхронная обработка массивов и асинхронные вызовы функций из очереди

Асинхронная обработка массивов:

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);
}

processArray([1,2,3], function(element){console.log(element);}, function(){console.log('End');});

Полуасинхронно-пакетная обработка массивов:

function timedProcessArray(items, process, callback){
    var todo = items.concat(); // создать копию массива оригинала
    setTimeout(function(){
        var start = +new Date();
        do {
            process(todo.shift());
        } while (todo.length > 0 && (+new Date() - start < 50));
        if (todo.length > 0){
            setTimeout(arguments.callee, 25);
        } else {
            callback(items);
        }
    }, 25);
}

timedProcessArray([1,2,3], function(element){console.log(element);}, function(){console.log('End');});

Асинхронный вызов функций из очереди:

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);
}

multistep([function(a){console.log(a);}, function(b){console.log(b);}, function(c){console.log(c);}], [1], function(){console.log('End');});

Комментариев нет:

Отправить комментарий