因此,下面的代碼只處理ajax調用成功的情況,如果ajax調用失敗,它將被忽略,並且deferred.reject()將永遠不會被調用。因此,如果我們遇到失敗的案例,那麼jQuery中的任何事件監聽器會永遠存在,導致內存泄漏?我是否總是調用JQuery Deferred.resolve或Deferred.reject?
$.when(loadSomething).done(function() {
// ...
});
function loadSomething() {
var deferred = $.Deferred();
// Only deal with the success case,
// If the ajax call failed, it is ignored and the deferred.reject() will never be invoked.
// So if we meet the failed case, will there any event listener inside jQuery will be keeped
// forever?
ajaxCallToLoad(onResult);
function onResult() {
deferred.resolve();
}
return deferred.promise();
}
如果你只是做一個Ajax調用,'$ .ajax' /'$ .post' /'$ .get' /'$ .getJSON'返回jqXHR對象,它是與遞延兼容方法,並自動爲您解決。所以你可以從'ajaxCallToLoad'返回對象,而不是創建另一個延遲。 –
謝謝,有理由我無法控制'ajaxCallToLoad'的行爲。你的意思是,如果我創建了一個延遲對象,我應該總是可以確定稍後調用解析或拒絕?那可能會導致內存泄漏?我試圖閱讀Jquery的源代碼,但它確實很複雜...... –
是否會導致內存泄漏取決於Deferred實現,但是最好總是解決或拒絕它。 –