捕获模块加载错误并处理它们

时间:2012-01-27 11:18:02

标签: javascript requirejs

我正在尝试使用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事件?有什么想法吗?

4 个答案:

答案 0 :(得分:38)

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

requirejs.org上的示例显示了如何处理他们想要为他们想要使用众所周知的标识符提供的资源尝试多个位置的情况。据推测,该示例中的整个代码库需要jQuery,需要“jquery”。无论jQuery恰好位于何处,它都可以作为“jquery”用于整个代码库。

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

答案 1 :(得分:19)

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

答案 2 :(得分:7)

您是否尝试覆盖了如here所示的requirejs.onError?

将catchError设置为true后,它对我有用:

require.config({catchError:true});
在调用任何define()require()函数之前

答案 3 :(得分:3)

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

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

您还可以使用err.requireType来捕捉特定错误,例如超时