通常,我將添加一個事件處理程序到dojo小部件。例如,更改事件的處理程序。然後,我的代碼中的某些內容會觸發更改事件 - 但我不知道是什麼。所以,通常你只需在你最喜歡的調試器中設置一個斷點,然後查看調用堆棧,並且可以快速跟蹤導致事件觸發的原因。但是,我的活動調用堆棧通常在dojo的lang.hitch
處結束,我猜測這是因爲dojo將函數傳遞給window.setTimeout
,所以當func在js事件隊列上執行時,調用堆棧中的大部分有用信息都消失了。調試dojo小部件事件 - setTimeout與調用堆棧
這是一個小的可執行樣本。
<b id="cb"></b>
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.9.3/dojo/dojo.js"></script>
<script>
require(["dijit/form/CheckBox", "dojo/domReady!"], function(CheckBox){
var checkBox = new CheckBox({
onChange: function(b){
console.log(b);
}
}, "cb");
// manually trigger change event.
// i want to be able to see this line in the debuggers call stack.
checkBox.set("checked", true);
});
</script>
有沒有簡單的方法來克服這個令人討厭的調試障礙?就像也許,一個告訴dojo不要通過setTimeout執行事件處理程序的設置?
在這種情況下,看起來_WidgetBase.js defer()
是一個叫setTimeout的人,但我知道在dojo中我經常遇到這個問題,並且希望有一個比編輯源代碼更好的方法。
您是否看過文章[使用Chrome DevTools調試異步JavaScript?](http://www.html5rocks.com/en/tutorials/developertools/async-call-stack/) – JoseM
@JoseM更好比我所希望的要多:)你應該將它作爲答案發布。 – goat