Load scripts in parallel

This commit is contained in:
Nate Hunzaker
2014-05-18 16:34:40 -04:00
parent bc79f623a1
commit 0614cfa43e
+32 -18
View File
@@ -18,6 +18,7 @@
'use strict';
var runScripts;
var loadScripts;
var headEl;
var buffer = require('buffer');
@@ -157,18 +158,40 @@ var load = exports.load = function(url, callback) {
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 0 || xhr.status === 200) {
run(xhr.responseText, url);
callback(xhr.responseText, url);
} else {
throw new Error("Could not load " + url);
}
if (callback) {
return callback();
}
}
};
return xhr.send(null);
};
loadScripts = function(scripts, callback) {
var result = [];
var check = function() {
var isComplete = result.every(function(task) {
return task !== false;
});
if (isComplete) callback(result);
};
scripts.forEach(function(script, i) {
result[i] = false;
if (script.src) {
load(script.src, function(content, url) {
result[i] = { content: content, url: url };
check();
});
} else {
result[i] = { content: script.innerHTML, url: null };
check();
}
});
};
runScripts = function() {
var scripts = document.getElementsByTagName('script');
@@ -182,20 +205,11 @@ runScripts = function() {
console.warn("You are using the in-browser JSX transformer. Be sure to precompile your JSX for production - http://facebook.github.io/react/docs/tooling-integration.html#jsx");
function tick() {
if (!jsxScripts.length) return;
var script = jsxScripts.shift();
if (script.src) {
load(script.src, tick);
} else {
run(script.innerHTML, null);
tick();
}
}
tick();
loadScripts(jsxScripts, function(results) {
results.forEach(function(config) {
run(config.content, config.url);
});
});
};
if (typeof window !== "undefined" && window !== null) {