捕捉模块加载错误并处理它们
我正在尝试使用require.js加载一些内容。 如果内容不存在,我想赶上错误,并通知用户。
在萤火虫,我可以看到两个错误:
“NetworkError:404 Not Found
…几秒钟后:
var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html# Load timeout for modules: modules/messages/messages http://requirejs.org/docs/errors.html#timeout
我的代码类似于:
require([path], function(content){ //need to catch errors as this will not be called; });
如何绑定到requirejs事件? 任何想法?
也可以使用errbacks来定制适合于require
的具体使用的error handling。 这里logging的错误是http://requirejs.org/docs/api.html#errbacks 。 基本上,如果加载失败,可以添加require
调用的函数。 如果加载成功,则在被调用的函数之后。
Chin的案子可以这样处理:
require([path], function(content){ //need to catch errors as this will not be called; }, function (err) { //display error to user });
以下是一个从多个位置尝试加载的示例:
require([mode_path], onload, function (err) { if (mode_path.indexOf("/") !== -1) // It is an actual path so don't try any further loading throw new Error("can't load mode " + mode_path); var path = "./modes/" + mode_path + "/" + mode_path; require([path], onload, function (err) { require([path + "_mode"], onload); }); });
在这个例子中, onload
将是所需的代码加载后调用的函数, mode_path
是标识模式的string。 你看到的代码尝试从3个不同的位置为编辑器加载模式模块。 如果mode_path
是foo
,它将尝试加载foo
,然后是./modes/foo/foo
,然后是./modes/foo/foo_mode
。
requirejs.org上的示例显示了如何处理他们想要尝试使用众所周知的标识符为资源提供多个位置的情况。 在这个例子中,假设整个代码库都需要jQuery,需要“jquery”。 无论jQuery恰好位于哪个位置,整个代码库都可以使用“jquery”。
我的例子并不在乎通过一个众所周知的标识符来让整个代码库知道这个模式,因为在这个特定的情况下,没有理由这样做。 onload
函数将其获取的模块存储到variables中,其余代码通过调用getMode()
方法来获取它。
设置requirejs onError函数:
requirejs.onError = function (err) { if (err.requireType === 'timeout') { // tell user alert("error: "+err); } else { throw err; } };
如果你想设置一个事件,你可以绑定并触发一个全局对象。 如:
$("body").bind("moduleFail",function(){ alert("Handling Event") }); requirejs.onError = function (err) { if (err.requireType === 'timeout') { $("body").trigger({type:"moduleFail",err:err}) } else { throw err; } }; require(["foo"],function(foo){ alert("loaded foo" + foo) })
你有没有尝试覆盖像这里显示的requirejs.onError?
它设置catchError为true后,为我工作,如下所示:
require.config({catchError:true});
在调用任何define()
或require()
函数之前。
您可以使用requirejs.onError函数:
requirejs.onError = function (err) { if (err) { //Reload } else { throw err; } };
您也可以使用err.requireType
来捕获超时等特定错误