add error handling to mini_require

pull/85/head
nightwing 2015-04-14 19:30:17 +04:00 zatwierdzone przez nightwing
rodzic 734f2bd3b2
commit 003aea3d49
1 zmienionych plików z 35 dodań i 9 usunięć

Wyświetl plik

@ -61,14 +61,15 @@ var define = function(name, deps, callback) {
define.lastModule = name; define.lastModule = name;
}; };
var defQueue = []; var defQueue = [];
var addToLoadQueue = function(missing, deps, callback) { var addToLoadQueue = function(missing, deps, callback, errback) {
var toLoad = missing.length; var toLoad = missing.length;
var map = {}; var map = {};
define.queue.push({ define.queue.push({
deps: deps, deps: deps,
map: map, map: map,
toLoad: toLoad, toLoad: toLoad,
callback: callback callback: callback,
errback: errback
}); });
for (var i = 0; i < missing.length; ++i) { for (var i = 0; i < missing.length; ++i) {
@ -82,9 +83,24 @@ var addToLoadQueue = function(missing, deps, callback) {
}; };
var processLoadQueue = function(err, id) { var processLoadQueue = function(err, id) {
var changed = false;
if (err) {
define.errors[err.id] = err;
define.queue.forEach(function(r) {
if (r.map[err.id]) {
r.toLoad = -1;
if (r.errback) r.errback(err);
}
});
if (define.lastModule = err.id)
define.lastModule = null;
define.pending = define.pending.filter(function(p) {
return p != err.id;
});
changed = true;
}
if (defQueue.length) { if (defQueue.length) {
if (err)
throw err;
if (defQueue.length > 1) if (defQueue.length > 1)
throw new Error("more than one module in defqueue"); throw new Error("more than one module in defqueue");
define(id, defQueue[0][0], defQueue[0][1]); define(id, defQueue[0][0], defQueue[0][1]);
@ -92,7 +108,6 @@ var processLoadQueue = function(err, id) {
} }
var pending = define.pending; var pending = define.pending;
var changed = false;
define.queue.forEach(function(r) { define.queue.forEach(function(r) {
pending.forEach(function(id) { pending.forEach(function(id) {
if (r.map[id]) if (r.map[id])
@ -102,15 +117,17 @@ var processLoadQueue = function(err, id) {
r.toLoad--; r.toLoad--;
if (!r.toLoad) { if (!r.toLoad) {
changed = true; changed = true;
_require("", r.deps, r.callback); _require("", r.deps, r.callback, r.errback);
} }
}); });
define.lastModule = null; define.lastModule = null;
if (pending.length) if (pending.length)
define.pending = []; define.pending = [];
if (changed) { if (changed) {
define.queue = define.queue.filter(function(r) { define.queue = define.queue.filter(function(r) {
return r.toLoad; return r.toLoad > 0;
}); });
} }
}; };
@ -118,6 +135,7 @@ var processLoadQueue = function(err, id) {
define.amd = true; define.amd = true;
define.queue = []; define.queue = [];
define.loaded = {}; define.loaded = {};
define.errors = {};
define.loading = {}; define.loading = {};
define.pending = []; define.pending = [];
define.modules = { require: 1, exports: 1, module: 1 }; define.modules = { require: 1, exports: 1, module: 1 };
@ -182,7 +200,7 @@ var lookup = function(moduleName) {
return mod; return mod;
}; };
var _require = function(parentId, moduleName, callback) { var _require = function(parentId, moduleName, callback, errback) {
if (typeof moduleName === "string") { if (typeof moduleName === "string") {
var depName = normalizeName(parentId, moduleName); var depName = normalizeName(parentId, moduleName);
var module = lookup(depName); var module = lookup(depName);
@ -197,7 +215,7 @@ var _require = function(parentId, moduleName, callback) {
var args = deps.map(lookup); var args = deps.map(lookup);
return callback && callback.apply(null, args); return callback && callback.apply(null, args);
} else { } else {
return addToLoadQueue(missing, deps, callback); return addToLoadQueue(missing, deps, callback, errback);
} }
} }
if (_require.original) if (_require.original)
@ -256,6 +274,7 @@ config.paths = Object.create(null);
require.undef = function(module, callback) { require.undef = function(module, callback) {
module = normalizeName("", module); module = normalizeName("", module);
var path = require.toUrl(module, ".js"); var path = require.toUrl(module, ".js");
delete define.errors[module];
delete define.loaded[module]; delete define.loaded[module];
delete define.modules[module]; delete define.modules[module];
delete define.fetchedUrls[path]; delete define.fetchedUrls[path];
@ -302,6 +321,7 @@ require.toUrl = function(moduleName, ext, skipExt) {
}; };
var loadScript = function(path, id, callback) { var loadScript = function(path, id, callback) {
// TODO use importScripts for webworkers
var head = document.head || document.documentElement; var head = document.head || document.documentElement;
var s = document.createElement("script"); var s = document.createElement("script");
s.src = path; s.src = path;
@ -320,6 +340,12 @@ var loadScript = function(path, id, callback) {
callback(null, id); callback(null, id);
} }
}; };
s.onerror = function(e) {
processLoadQueue({
id: id,
path: path
});
}
}; };
require.load = function(module) { require.load = function(module) {