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