【发布时间】:2013-12-19 03:28:20
【问题描述】:
所以如下代码,它只处理ajax调用成功的情况,如果ajax调用失败,它会被忽略并且永远不会调用deferred.reject()。那么如果我们遇到了失败的情况,会不会有jQuery内部的事件监听器会被永久保留而导致内存泄漏呢?
$.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返回一个与 Deferred 方法兼容并自动解析为的 jqXHR 对象你。因此,您可以从ajaxCallToLoad返回该对象,而不是创建另一个 deferred。 -
谢谢,我无法控制
ajaxCallToLoad的行为是有原因的。你的意思是如果我创建了一个延迟对象,我应该总是可以确保稍后调用已解决或拒绝?这会导致内存泄漏吗?我曾尝试阅读Jquery的源代码,但它确实很复杂...... -
它是否会导致内存泄漏取决于 Deferred 的实现,但是是的,最好总是解决或拒绝它。
标签: javascript jquery