Javascript 捕获模块加载错误并对其进行处理

Javascript 捕获模块加载错误并对其进行处理,javascript,requirejs,Javascript,Requirejs,我正在尝试使用require.js加载一些内容。如果内容不存在,我希望捕获错误并通知用户 在firebug中,我可以看到两个错误: “找不到NetworkError:404 …几秒钟后: var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html# Load timeout for modules: modules/messages/messages http://requirejs.org/docs/errors.html

我正在尝试使用require.js加载一些内容。如果内容不存在,我希望捕获错误并通知用户

在firebug中,我可以看到两个错误:

“找不到NetworkError:404

…几秒钟后:

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事件?有什么想法吗?

您是否尝试覆盖如图所示的requirejs.onError

在将catchError设置为true后,它对我有效,如下所示:

require.config({catchError:true});

在调用任何
define()
require()
函数之前。

设置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)
})

还可以使用errbacks来定制适合于
require
特定用途的错误处理。这里记录了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\u path
是标识模式的字符串。您看到的是试图从3个不同位置加载编辑器模式模块的代码。如果
mode\u path
foo
,它将尝试加载
foo
,则n
/modes/foo/foo
然后
/modes/foo/foo\u mode

requirejs.org上的示例展示了如何处理这样一种情况,即他们希望尝试多个位置以获得一个已知标识符可用的资源“。无论jQuery恰好位于哪个位置,它都可以作为“jQuery”供整个代码库使用


我的示例并不关心通过一个众所周知的标识符使整个代码库知道模式,因为在这个特定的例子中,没有很好的理由这样做。
onload
函数将它获得的模块存储到一个变量中,代码库的其余部分通过调用
getMode()
方法获得该模块。

您可以将requirejs.onError函数用作:

requirejs.onError = function (err) {
    if (err) {
        //Reload
    } 
    else {
        throw err;
    }   
};

您还可以使用
err.requireType
捕获特定的错误,如超时

我刚刚遇到这个。。。我要浏览一下网页。比赛到终点?@Relic:)刚刚发现了这一点,它涵盖了这一点-并不能解决要求抛出一个错误从而打破所有其他要求的问题。。。我想这就是为什么这是一个要求,嗯?我责怪webKit,因为这是我唯一一个存在脚本加载顺序问题的浏览器,所以我必须封装整个文档.ready(),并将所有脚本放在顶部,而不仅仅是在启动脚本时。幸运的是,这是一个小项目和名称空间,但这对我以后没有帮助我需要一个退路。。。我并没有做一个完整的窗口捕获,我实际上是在试图编辑requireJS以提供一个选项。@Relic是的,还在这里工作。在使用require之前,可能需要ping它以检查它是否存在。嗯,如果我有什么值得一看的东西,我会告诉你的。干杯,这么说吧,这是合乎逻辑的事情。。。如果加载一个文件以执行某些操作是“必需的”,那么它当然会出错并冻结该require bucket中的所有代码,因为它需要的文件不在那里。这很有道理。。。我不认为经过深思熟虑之后就应该解决这个问题。保留所有“必需”文件的本地副本。我知道你不能依赖第三方URL。这不会修复代码。。。问题是设计过程中的逻辑,如果你遇到这个。。。或者,如果文件确实存在,您必须确保没有将“.js”放在文件引用的末尾。。。每次都会得到我。它在v2中被删除: