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
... puis 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 se lierait-on aux événements requirejs? Une idée?
Il est également possible d'utiliser des erreurs de retour pour avoir une gestion des erreurs personnalisée appropriée à l'utilisation spécifique de require
. Les erreurs de retour sont documentées ici http://requirejs.org/docs/api.html#errbacks . Fondamentalement, vous pouvez ajouter à require
une fonction à appeler si le chargement échoue. Il vient juste après la fonction à appeler si le chargement est réussi.
Le cas de Chin pourrait être traité comme:
require([path], function(content){
//need to catch errors as this will not be called;
}, function (err) {
//display error to user
});
Voici un exemple qui essaie 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 le code requis chargé, et mode_path
Est une chaîne identifiant le mode. Ce que vous voyez là est du code essayant de charger un module de mode pour un éditeur à partir de 3 emplacements différents. Si mode_path
Est foo
, il essaiera de charger foo
, puis ./modes/foo/foo
Puis ./modes/foo/foo_mode
.
L'exemple de requirejs.org montre comment gérer un cas où ils souhaitent essayer plusieurs emplacements pour une ressource qu'ils souhaitent mettre à disposition avec un identifiant bien connu. Vraisemblablement, la base de code entière dans cet exemple nécessite jQuery en exigeant "jquery". Quel que soit l'emplacement où jQuery se trouve, il devient accessible à toute la base de code sous le nom de "jquery".
Mon exemple ne se soucie pas de faire connaître le mode à l'ensemble de la base de code via un identifiant bien connu, car dans ce cas spécifique, il n'y a aucune bonne raison de le faire. La fonction onload
stocke le module qu'il obtient 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 vous 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 indiqué ici ?
Cela a fonctionné pour moi après avoir défini catchError sur true comme ceci:
require.config({catchError:true});
avant d'appeler une fonction define()
ou require()
.
Vous pouvez utiliser la fonction requirejs.onError comme:
requirejs.onError = function (err) {
if (err) {
//Reload
}
else {
throw err;
}
};
Vous pouvez aussi utiliser err.requireType
pour détecter des erreurs spécifiques telles que les délais d'expiration