From 0614cfa43e255aee20bf50d425250d089363cd45 Mon Sep 17 00:00:00 2001 From: Nate Hunzaker Date: Sun, 18 May 2014 16:34:40 -0400 Subject: [PATCH] Load scripts in parallel --- vendor/browser-transforms.js | 50 +++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/vendor/browser-transforms.js b/vendor/browser-transforms.js index 689666ac71..797f233829 100644 --- a/vendor/browser-transforms.js +++ b/vendor/browser-transforms.js @@ -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) {