40 votes

La capture de chargement des modules, les erreurs et de les traiter

Je suis en train de charger certains contenus à l'aide require.js. Si le contenu n'existe pas, j'aimerais capture de l'erreur et de notifier à l'utilisateur.

Dans firebug je vois deux erreurs:

"NetworkError: 404 Not Found

...et 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 pourrait-on se lier à requirejs événements? Une idée?

41voto

Louis Points 13534

Il est également possible d'utiliser errbacks à avoir personnalisé la gestion d'erreur approprié à l'utilisation spécifique de l' require. Errbacks sont documentées ici http://requirejs.org/docs/api.html#errbacks. Fondamentalement, vous pouvez ajouter à l' require une fonction à appeler si le chargement échoue. Il vient juste après la fonction qui doit être appelée que si la charge est réussie.

Ces cas peuvent être traités en tant que:

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 chargement à 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 des charges, mode_path est une chaîne de caractères identifiant la mode. Ce que vous voyez là est le code de la tentative de chargement d'un module en mode pour un éditeur à partir de 3 endroits différents. Si mode_path est foo, il va essayer de charger foo, alors ./modes/foo/foo puis ./modes/foo/foo_mode.

L'exemple à requirejs.org montre comment on peut traiter un cas où ils veulent essayer plusieurs emplacements pour les ressources qu'ils souhaitent rendre disponibles avec un identificateur bien connu. Sans doute l'ensemble de la base de code dans cet exemple nécessite jQuery en exigeant "jquery". Quel que soit l'endroit jQuery se trouve à l', il devient disponible pour l'ensemble de la base de code comme "jquery".

Mon exemple ne se soucie pas de faire de la mode connue pour l'ensemble de la base de code par l'intermédiaire d'un identificateur bien connu parce que dans ce cas précis il n'y a aucune bonne raison de le faire. L' onload fonction enregistre le module, il pénètre dans une variable et le reste de la base de code, il obtient en appelant un getMode() méthode.

19voto

Shanimal Points 4067

définir la requirejs onError fonction:

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

Si vous souhaitez organiser un événement, vous pouvez lier à et de déclencher un objet global. Tels 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)
})

8voto

Gabriel Jürgens Points 973

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

Il a travaillé pour moi après la mise catchError comme vrai, comme ceci:

require.config({catchError:true});

avant l'appel à la définir() o require() les fonctions.

3voto

anurag_29 Points 124

Vous pouvez utiliser le requirejs.onError fonction :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X