Ошибка Javascript проглочена в Dojo

Я использую Dojo 1.8.1, и часто случается так, что в случае необнаруженных ошибок ссылок (например, доступ к несуществующей функции/переменным/членам объекта) сценарий молча завершается сбоем без каких-либо сообщений на консоли или ошибок, что делает процесс отладки намного (намного) медленнее!

Обычно это происходит после цепочки вызовов функций и (могу ошибаться) чаще после остаточного вызова с использованием объекта "dojo/request". Такое поведение может происходить случайным образом, поэтому неперехваченная ошибка ссылки может быть выдана или проглочена без какого-либо прогноза в той же строке, скорее всего, на основе вызывающей функции.

Вот пример, который я сделал с описанной проблемой:

define([ "dojo/dom", "dojo/dom-construct", "dojo/request", "dojo/ready" ], 
function(dom, domConstruct, request) {

    var prettyDate = function (millisecDate) {

        // wrong: console won't display the error, script will stop
        // uncaughtReferenceError['notExistingIndex']; 
        // uncaughtReferenceError.notExistingMethod(); 

        // if commented, script will stop at "return" line without errors on console
        var date = new Date(millisecDate);
        // same here, if commented "return" should throw the exception
        var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
        // any misspell on the "date"  methods will cause the script to fail without logs (eg: getUTCYear() instead of getUTCFullYear())
        return  date.getUTCDate() + ' ' + months[date.getUTCMonth()] + ' ' + date.getUTCFullYear();

    };

    var startup = function(domNode) {

        // uncaughtReferenceError['notExistingIndex']; // correct: console will display the error and script will stop
        // uncaughtReferenceError.notExistingMethod(); // same here

        request.get("rest/repository/", {handleAs: "json"}).then(
                function(result){
                    var ul = domConstruct.create("ul", {  }, domNode);
                    result.repositories.forEach(function(repo) {
                        domConstruct.create("li", { innerHTML : prettyDate(repo.lastUpdated) }, ul);
                    });
                });

    };

    return { init: startup };

});

Dojo настроен с isDebug в true, но это не имеет значения:

<script>
    dojoConfig = {
        async : true,
        isDebug : true,
        parseOnLoad : true,
        baseUrl : "js/",
        packages : [ { name : "dsmonitor", location : "dsmonitor" } ]
    };
</script>

Вот правильная страница (все работает, код сверху): все работает

Здесь, если я помещу ошибку в метод запуска (загрузка страницы остановится, но будет отображаться ошибка, uncaughtReferenceError не комментируется при запуске): введите здесь описание изображения

Здесь, если я помещу ошибку в функцию prettyDate (загрузка страницы остановится и ошибка не будет показана, uncaughtReferenceError не будет прокомментирован в prettyDate, отладка в реальном случае превратится в ад): введите здесь описание изображения

Я не знаю, единственный ли я сталкиваюсь с этой проблемой или я делаю что-то особенно неправильно, но это происходит во многих моих проектах (и я вынужден делать огромное количество вызовов console.log, чтобы понять что происходит) и я не смог найти никакого возможного решения в Интернете!


person pierpytom    schedule 10.06.2014    source источник


Ответы (2)


Я обнаружил, что это происходит, когда библиотека dojo импортируется с внешнего сервера (например: //ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js) .

Если я хочу видеть непредвиденные ошибки в консоли при сбое обратного вызова rest, у меня должна быть библиотека dojo на том же сервере/порте веб-сайта.

Поскольку это замедляет разработку в Eclipse (проверка полной библиотеки чертовски медленная), я обнаружил, что webjar может упростить немного суеты!

Надеюсь, это поможет кому-то!

person pierpytom    schedule 19.02.2015

У вас могут быть проблемы, потому что ваш код не ждет, пока DOM будет готов к использованию.

Ты используешь:

define(["dojo/dom", "dojo/dom-construct", "dojo/request", "dojo/ready"],
  function(dom, domConstruct, request) {
  });

Согласно странице Dojo domReady, вы должны использовать подключаемый модуль domReady, например это:

define(["dojo/dom", "dojo/dom-construct", "dojo/request", "dojo/domReady!"],
       function(dom, domConstruct, request) {}
);

В качестве альтернативы, если вы хотите использовать готовую функцию, вам нужно будет сделать это следующим образом:

define(["dojo/dom", "dojo/dom-construct", "dojo/request", "dojo/ready"],
  function(dom, domConstruct, request, ready) {
    ready(function() {});
  });

person mmckenzie    schedule 20.02.2015
comment
Привет @mmckenzie, спасибо за интерес! К сожалению, это не так, я не поставил файл index.html, но в его конце я использую готовый обратный вызов (таким образом, как вы упомянули), чтобы вызвать init на фрагменте, который я написал выше! - person pierpytom; 02.03.2015