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