kopia lustrzana https://github.com/c9/core
add error handling to mini_require
rodzic
734f2bd3b2
commit
003aea3d49
|
@ -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) {
|
||||||
|
|
Ładowanie…
Reference in New Issue