2012-01-27 5 views
37

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

+2

Я просто побежал в это ... Я буду рыскать веб. Гонка до финиша? – Relic

+0

@Relic :) Только что нашел это, которое покрывает его - http://groups.google.com/group/requirejs/browse_thread/thread/8a1edb196ce9c421 – Chin

+0

Не исправляет проблему необходимости бросать ошибку, которая нарушает все остальные требования. .. Полагаю, именно поэтому это требует, да? Я обвиняю webKit, потому что это единственный браузер, который имеет проблемы с порядком загрузки для скриптов, поэтому я должен инкапсулировать весь document.ready() со всеми моими сценариями вверху, а не ТОЛЬКО при их запуске. к счастью, это небольшой проект и пространство имен, но это не помогает мне в будущем. --- Мне нужен резерв ... и я не делаю захвата всего окна, я на самом деле пытаюсь отредактировать requireJS, чтобы дать возможность. – Relic

ответ

6

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

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

require.config({catchError:true}); 

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

+0

Это не будет исправлять код ... проблема заключается в логике процесса дизайнеров, если вы сталкиваетесь с этим ... либо, либо если файл существует, вам нужно убедиться, что вы не помещаете '.js 'в конце ссылки на файл ... получает меня каждый раз. – Relic

+0

Удалено в v2: https://github.com/requirejs/requirejs/wiki/Upgrading-to-RequireJS-2.0#removed-items- – vedi

18

установить 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) 
}) 
36

Также можно использовать errbacks, чтобы подгоняли обработку ошибок целесообразно конкретного использования require. Ошибки описаны здесь 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().

+1

Отличный ответ. :-) Отлично!!! – Codemole

3

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

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

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

Смежные вопросы