Проблема
JSFiddle: http://jsfiddle.net/missingno/Gz8Pe/2/
У меня есть код, который выглядит так:
var d = new Deferred();
d.resolve(17);
return d.then(function(){
//do some stuff...
})
.then(function(){
var obj = a_funtion_that_returns_null_on_IE();
var x = obj.some_property; //BOOM!
});
Проблема в том, что когда я работаю в IE, все, что я вижу, это 'obj' is null or not an object
ошибки, без какой-либо ссылки на соответствующий номер строки и без остановки отладчика на проблемной строке (как мне бы этого хотелось).
Подобные проблемы затрудняют отладку кода, и единственные решения, которые я могу придумать прямо сейчас (возиться с библиотекой потока управления или прибегать к пошаговой отладке с помощью отладчика или console.log), — это то, что я лучше бы не пришлось.
Что я думаю, происходит
Чтобы разрешить добавление errbacks после запуска цепочки, then
будет упреждающе перехватывать любые исключения, вызванные обратными вызовами. Я думаю, что это причина того, что отладчик IE не останавливается на ошибке или не показывает обычное сообщение об ошибке с номером строки в нем.
Сообщения об ошибках без номеров строк поступают из библиотеки управления потоком: она предоставляет хук deferredOnError
, который вызывается всякий раз, когда исключение перехватывается и сохраняется на потом, а поведение по умолчанию — console.error-ing объект Error:
dojo.config.deferredOnError = function(err){
//a chance to log the exception after it is captured by "then"
//or do other things with it
console.error(err);
}
К сожалению, я не смог найти способ получить номер строки или трассировку стека из объекта ошибки в IE, а хук вызывается таким образом, что я не могу просто повторно сгенерировать исключение и позволить ему подняться на верхний уровень.
Что я хочу
Я хочу иметь лучший способ отладки асинхронного кода, а затем шаг за шагом идти вместе с отладчиком. В лучшем случае способ остановки отладчика на исключениях (как это происходит с необработанными исключениями) или по крайней мере способ получить номера строк или стек следы от объекта Error, который был сгенерирован.