問題
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 を使用した段階的なデバッグに頼る) は、私が考えることです。むしろしなくていい。
何が起こっていると思いますか
チェーンが起動された後にエラーバックを追加できるようにするためにthen
、コールバックによってスローされた例外を事前にキャッチします。これが、IE デバッガーがエラーで停止しないか、行番号を含む通常のエラー メッセージを表示する理由だと思います。
行番号のないエラー メッセージは、制御フロー ライブラリからのものです。これはdeferredOnError
、例外がキャッチされて後で使用できるように保存されるたびに呼び出されるフックを提供します。デフォルトの動作は、Error オブジェクトを console.error-ing することです。
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 オブジェクトから行番号またはスタック トレースを取得する方法。