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;
|
||||
};
|
||||
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) {
|
||||
|
|
Ładowanie…
Reference in New Issue