Load scripts in parallel
Nate Hunzaker committed
May 18, 2014 at 16:34 UTC
0614cfa43e255aee20bf50d425250d089363cd45
1 file changed
+32
-18
vendor/browser-transforms.js
+32
-18
@@ -18,6 +18,7 @@
18
19
'use strict';
20
var runScripts;
21
+var loadScripts;
22
var headEl;
23
24
var buffer = require('buffer');
@@ -157,18 +158,40 @@ var load = exports.load = function(url, callback) {
158
xhr.onreadystatechange = function() {
159
if (xhr.readyState === 4) {
160
if (xhr.status === 0 || xhr.status === 200) {
160
- run(xhr.responseText, url);
161
+ callback(xhr.responseText, url);
162
} else {
163
throw new Error("Could not load " + url);
164
}
164
- if (callback) {
165
- return callback();
166
- }
165
}
166
};
167
return xhr.send(null);
168
};
169
170
+loadScripts = function(scripts, callback) {
171
+ var result = [];
172
+
173
+ var check = function() {
174
+ var isComplete = result.every(function(task) {
175
+ return task !== false;
176
+ });
177
+ if (isComplete) callback(result);
178
+ };
179
+
180
+ scripts.forEach(function(script, i) {
181
+ result[i] = false;
182
+
183
+ if (script.src) {
184
+ load(script.src, function(content, url) {
185
+ result[i] = { content: content, url: url };
186
+ check();
187
+ });
188
+ } else {
189
+ result[i] = { content: script.innerHTML, url: null };
190
+ check();
191
+ }
192
+ });
193
+};
194
+
195
runScripts = function() {
196
var scripts = document.getElementsByTagName('script');
197
@@ -182,20 +205,11 @@ runScripts = function() {
205
206
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");
207
185
- function tick() {
186
- if (!jsxScripts.length) return;
187
-
188
- var script = jsxScripts.shift();
189
-
190
- if (script.src) {
191
- load(script.src, tick);
192
- } else {
193
- run(script.innerHTML, null);
194
- tick();
195
- }
196
- }
197
-
198
- tick();
208
+ loadScripts(jsxScripts, function(results) {
209
+ results.forEach(function(config) {
210
+ run(config.content, config.url);
211
+ });
212
+ });
213
};
214
215
if (typeof window !== "undefined" && window !== null) {