Я использую 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, чтобы понять что происходит) и я не смог найти никакого возможного решения в Интернете!