Подтвердить что ты не робот

Улавливание ошибок загрузки модулей и их обработка

Я пытаюсь загрузить некоторый контент, используя 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? Любая идея?

4b9b3361

Ответ 1

Также возможно использовать errbacks для настройки обработки ошибок, соответствующей конкретному использованию require. Errbacks описаны здесь http://requirejs.org/docs/api.html#errbacks. В принципе, вы можете добавить к require функцию, которая будет вызываться, если сбой загрузки. Он появляется сразу после вызова функции, если загрузка выполнена успешно.

Случай Чин может быть обработан как:

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 - это строка, идентифицирующая этот режим. Что вы видите, есть код, пытающийся загрузить модуль режима для редактора из трех разных мест. Если mode_path - foo, он попытается загрузить foo, затем ./modes/foo/foo, а затем ./modes/foo/foo_mode.

В примере на requirejs.org показано, как можно обрабатывать случай, когда они хотят попробовать несколько местоположений для ресурса, который они хотят сделать доступным с помощью известного идентификатора. Предположительно, вся база кода в этом примере требует jQuery, требуя "jquery". В любом месте, где находится jQuery, оно становится доступным для всей базы кода как "jquery".

Мой пример не заботится о том, чтобы режим, известный всей кодовой базе, через известный идентификатор, потому что в этом конкретном случае нет веских оснований для этого. Функция onload сохраняет модуль, который он получает в переменную, а остальная часть базы кода получает его, вызывая метод getMode().

Ответ 2

установить функцию 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)
})

Ответ 3

Вы пытались переопределить requirejs.onError, как показано здесь?

Он работал у меня после установки catchError как истинного:

require.config({catchError:true});

перед вызовом каких-либо функций define() или require().

Ответ 4

Вы можете использовать функцию requirejs.onError как:

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

Вы также можете использовать err.requireType для обнаружения определенных ошибок, таких как тайм-ауты