web-dev-qa-db-fra.com

Détecter les erreurs de chargement du module et les traiter

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?

40
Chin

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().

38
Louis

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)
})
19
Shanimal

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().

7
Gabriel Jürgens

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

3
anurag_29