Simple async queue

by fiddlegrimbo

JavaScript

function readFile(file, onload) {
    var fr = new FileReader();
    fr.onload = onload;
    fr.readAsDataURL(file);
}

function fakeReadFile(file, onload) {
    var delay = Math.random() * 5000;
    setTimeout(onload.bind(null, file, delay), delay);
}

var Q = (function () {
    function Q() {
        this.tasks = [];
    }
    Q.prototype.add = function (taskFn) {
        this.tasks.push(taskFn);
    };
    Q.prototype.process = function (callback) {
        var count = 0;
        var results = [];
        var tasks = this.tasks;
        tasks.forEach(function (taskFn, i) {
            taskFn(function () {
                results[i] = arguments;
                count++;
                if (count === tasks.length) {
                    callback(results);
                }
            });
        });
    }
    return Q;
}());

function loadImages(files, callback) {
    var q = new Q();

    function makeOnLoad(i, fr) {
        return function () {
            var img = document.createElement('img');
            img.src = fr.result;
            img.className = 'file-result';
            images[i] = img;
        };
    }

    for (var i = 0; i < files.length; i++) {
        q.add(fakeReadFile.bind(null, files[i]));
    }

    q.process(callback);
}

function main(fileInputs) {
    var fileInputs = fileInputs || document.getElementsByClassName('file-input');
    var activeFileInputs = [];

    for (var i = 0; i < fileInputs.length; i++) {
        var fi = fileInputs[i];
        if (fi.files[0]) {
            activeFileInputs.push(fi);
        }
    }

    loadImages(activeFileInputs.map(function (fi) {
        return fi.files[0];
    }), function (responses) {
        console.log(responses);
    });
}

var fakeFileInputs = ['1', '2', '3'].map(function (it) {
    return {
        files: [it]
    };
});
main(fakeFileInputs);