2012-01-27 7 views
37

Próbuję załadować niektóre treści za pomocą require.js. Jeśli treść nie istnieje, chciałabym złapać błąd i powiadomić użytkownika.Łapanie błędów ładowania modułów i ich przetwarzanie

w Firebug widzę dwa błędy:

"NetworkError: 404 Not Found

... a kilka sekund później:

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 

Mój kod przypomina:

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

jaki sposób jeden wiązać do zdarzeń requirejs? Dowolny pomysł?

+2

ja po prostu zabrakło na to ... Mam zamiar przeszukać sieć. Wyścig do mety? – Relic

+0

@Relic :) Po prostu znalazłem to, co go obejmuje - http://groups.google.com/group/requirejs/browse_thread/thread/8a1edb196ce9c421 – Chin

+0

Nie rozwiązuje problemu wymagającego zgłaszania błędu, który łamie wszystkie pozostałe wymagania. .. Chyba dlatego jest to wymagane? Obwiniam webKit, ponieważ jest to jedyna przeglądarka, do której mam problemy z ładowaniem dla skryptów, więc muszę zamknąć cały document.ready() ze wszystkimi moimi skryptami na górze, a nie TYLKO, kiedy są wystrzeliwane. na szczęście jest to mały projekt i przestrzeń nazw, ale to nie pomoże mi w przyszłości. --- --- Potrzebuję awaryjnego ... i nie robię całego przechwytywania okna, tak naprawdę próbuję edytować requireJS, aby dać opcję. – Relic

Odpowiedz

6

Czy próbowałeś zastąpić requirejs.onError jak pokazano here?

on pracował dla mnie po ustawieniu catchError jak prawdziwy tak:

require.config({catchError:true}); 

przed wywołaniem żadnych define() lub require() funkcje.

+0

To nie naprawi kodu ... problem jest logiczny w procesie projektantów, jeśli natkniesz się na to ... albo, czy plik istnieje, musisz upewnić się, że nie wstawisz ".js "na końcu pliku odniesienia ... dostaje mnie za każdym razem. – Relic

+0

Został usunięty w wersji 2: https://github.com/requirejs/requirejs/wiki/Upgrading-to-RequireJS-2.0#removed-items- – vedi

18

ustawić requirejs onError funkcję:

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

Jeśli chcesz ustawić zdarzenie można wiązania i inicjować globalnego obiektu. Takich jak:

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

Możliwe jest również użycie errbacks aby dostosował błąd obsługi odpowiednie do konkretnego zastosowania require. Błędy są tutaj udokumentowane http://requirejs.org/docs/api.html#errbacks. Zasadniczo można dodać do require funkcję, która zostanie wywołana, jeśli obciążenie się nie powiedzie. Pojawia się zaraz po wywołaniu funkcji, jeśli ładowanie się powiedzie. Sprawa

brodzie mogłyby być traktowane jako:

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

Oto przykład, który stara ładowania z wielu miejsc:

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

W tym przykładzie onload byłaby funkcja wywoływana raz wymaganych obciążeń kodowych i mode_path jest ciągiem identyfikującym tryb. To, co widzisz, to kod próbujący załadować moduł trybu dla edytora z 3 różnych lokalizacji. Jeśli mode_path jest foo, spróbuje załadować foo, następnie ./modes/foo/foo, a następnie ./modes/foo/foo_mode.

Przykład w requirejs.org pokazuje, w jaki sposób można obsłużyć przypadek, w którym chce wypróbować wiele lokalizacji dla zasobu, który chce udostępnić ze znanym identyfikatorem. Przypuszczalnie cała baza kodu w tym przykładzie wymaga jQuery, wymagając "jquery". Niezależnie od lokalizacji, w której znajduje się jQuery, staje się ona dostępna dla całej bazy kodu jako "jquery".

Mój przykład nie dba o udostępnienie trybu całej bazie kodu za pomocą dobrze znanego identyfikatora, ponieważ w tym konkretnym przypadku nie ma ku temu dobrego powodu. Funkcja onload przechowuje moduł, który dostaje do zmiennej, a reszta bazy kodu pobiera je, wywołując metodę getMode().

+1

Świetna odpowiedź. :-) Doskonały!!! – Codemole

3

Można użyć funkcji requirejs.onError jak:

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

Można również użyć err.requireType do połowu konkretnych błędów, takich jak limity czasu

Powiązane problemy