我正在研究一個廣泛使用AJAX和jQuery事件的應用程序,並且遇到了我無法解釋的奇怪行爲。違規的篡改版本的片段:jQuery.Deferred異常 - 對事件處理程序的未請求調用
$(document).on("app.refresh", function(jqEvent) {
//app.server.get returns an AJAX promise
app.server.get("url/goes/here").
done(function(result) { $(document).trigger("app.refresh.done", [result]); }).
fail(function() { $(document).trigger("app.refresh.fail"); });
}
$(document).on("app.refresh.done", function(jqEvent, result) {
if (result.success)
cache(result.data);
}
$(function() {
$(document).trigger("app.refresh");
});
爲"app.refresh.done"
的處理程序執行兩次。第二次執行堆棧時顯示來自$(document).trigger("app.refresh");
的調用,使用AJAX調用返回的數據填充result
,並且完成而沒有錯誤。它第一次執行,但是:
- 沒有請求向服務器發出(放置在端點斷點通過AJAX被訪問不會被擊中)
- 由於服務器沒有訪問
result
是undefined
,導致線路上出現錯誤if (result.success)
:jQuery.Deferred exception: result is not defined ReferenceError: result is not defined
- 堆棧在執行時顯示該呼叫不是來自觸發器。它起源於一個名爲
process
的函數中包含的名爲mightThrow
的jQuery函數。
進一步混淆我的努力弄清楚是怎麼回事是完全改變了事件名稱"refresh.begin"
,"refresh.done"
和"refresh.fail"
解決問題的事實。究竟是什麼造成了錯誤的第一個電話?