Capture des erreurs de chargement et traitement du module

J'essaie de charger du contenu en utilisant require.js. Si le contenu n'existe pas, j'aimerais attraper l'erreur et informer l'utilisateur.

Dans Firebug, je peux voir deux erreurs:

"NetworkError: 404 introuvable

… et quelques secondes plus tard:

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 

Mon code ressemble:

 require([path], function(content){ //need to catch errors as this will not be called; }); 

Comment lieriez-vous les événements requis? Une idée?

Il est également possible d'utiliser des erreurs pour avoir une gestion personnalisée des erreurs appropriée à l'utilisation spécifique requise. Les Errbacks sont documentés ici http://requirejs.org/docs/api.html#errbacks . Fondamentalement, vous pouvez ajouter à require une fonction à appeler si la charge échoue. Il vient juste après la fonction à appeler si la charge est réussie.

Le cas de Chin pourrait être traité comme suit:

 require([path], function(content){ //need to catch errors as this will not be called; }, function (err) { //display error to user }); 

Voici un exemple qui tente de charger à partir de plusieurs endroits:

 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); }); }); 

Dans cet exemple onload serait la fonction appelée une fois que le code requis est chargé, et mode_path est une chaîne identifiant le mode. Ce que vous voyez là, c'est un code qui tente de charger un module de mode pour un éditeur depuis 3 sites différents. Si mode_path est foo , il essaiera de charger foo , puis ./modes/foo/foo et ensuite ./modes/foo/foo_mode .

L'exemple à requirejs.org montre comment on peut traiter un cas où ils veulent essayer plusieurs emplacements pour une ressource qu'ils veulent mettre à disposition avec un identifiant bien connu. On peut supposer que l'intégralité de la base de code dans cet exemple nécessite jQuery en demandant "jquery". Quel que soit l'endroit où jQuery se trouve, il devient disponible pour l'ensemble de la base de code comme "jquery".

Mon exemple ne se préoccupe pas de rendre le mode connu de l'ensemble de la base de code à travers un identifiant bien connu car, dans ce cas particulier, il n'y a pas de bonnes raisons de le faire. La fonction onload stocke le module qu'il entre dans une variable et le reste de la base de code l'obtient en appelant une méthode getMode() .

Définissez la fonction requirejs onError:

 requirejs.onError = function (err) { if (err.requireType === 'timeout') { // tell user alert("error: "+err); } else { throw err; } }; 

Si vous souhaitez configurer un événement, vous pouvez lier et déclencher un objet global. Tel que:

 $("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) }) 

Avez-vous essayé de remplacer le requirejs.onError comme montré ici ?

Cela a fonctionné pour moi après avoir défini catchError comme vrai comme ceci:

 require.config({catchError:true}); 

Avant d'appeler toute fonction define() ou require() .

Vous pouvez utiliser la fonction requirejs.onError comme suit:

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

Vous pouvez également utiliser err.requireType pour attraper des erreurs spécifiques, comme les délais