因此,如下面的代码所示,它只处理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();
}发布于 2013-12-19 07:54:32
因此,如果我们遇到失败的情况,会不会永远保留jQuery中的事件侦听器以导致内存泄漏?
几乎可以肯定不是。
但是如果您这样做,您将显式地使用承诺语义,但随后破坏了承诺契约。那是很糟糕的练习。你必须选择“最佳做法”:
ajaxCallToLoad,以便它也通知您失败,并在发生延迟时调用reject。(如果ajaxCallToLoad使用jQuery的$.ajax函数,您可以只使用$.ajax返回的jqXHR对象;它实现了Promise。)发布于 2013-12-19 05:34:59
要回答真正的问题,只有在维护对延迟和/或代码中某个地方的引用的情况下,才会泄漏内存,而不管您是解决还是拒绝延迟。如果没有引用,那么它将像往常一样被垃圾收集。
尽管如此,我认为在这种情况下,您应该使用.then方法来转换/过滤结果,而不是手动构造延迟。为了这个例子,让我们创建一个名为load的方法,它只是随机地解析或拒绝一个类似于可能会失败的延迟的ajax请求。
function load() {
return $.Deferred(function( dfr ) {
if ( Date.now() % 2 ) {
dfr.resolve( 1 );
}
else {
dfr.reject( "OHNO!" );
}
}).promise();
}现在您能够使用.then来过滤它,如下所示:
var filteredResult = load().then(function( result ) {
return result * 2;
});filteredResult现在是一个承诺,如果负载被解析,它会使原来的结果加倍,所以filterResult.done( console.log.bind( console ) )会将2打印到控制台。如果加载失败/被拒绝,那么故障处理程序仍将正常工作。
https://stackoverflow.com/questions/20672972
复制相似问题