首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该总是调用JQuery Deferred.resolve还是Deferred.reject?

我应该总是调用JQuery Deferred.resolve还是Deferred.reject?
EN

Stack Overflow用户
提问于 2013-12-19 03:28:20
回答 2查看 412关注 0票数 1

因此,如下面的代码所示,它只处理ajax调用成功的情况,如果ajax调用失败,它将被忽略,deferred.reject()将永远不会被调用。因此,如果我们遇到失败的情况,会不会永远保留jQuery中的事件侦听器以导致内存泄漏?

代码语言:javascript
复制
$.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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-19 07:54:32

因此,如果我们遇到失败的情况,会不会永远保留jQuery中的事件侦听器以导致内存泄漏?

几乎可以肯定不是。

但是如果您这样做,您将显式地使用承诺语义,但随后破坏了承诺契约。那是很糟糕的练习。你必须选择“最佳做法”:

  1. 继续使用承诺,但遵守合同。更新ajaxCallToLoad,以便它也通知您失败,并在发生延迟时调用reject。(如果ajaxCallToLoad使用jQuery的$.ajax函数,您可以只使用$.ajax返回的jqXHR对象;它实现了Promise。)
  2. 如果你不想履行承诺合同,只需使用一个正常的“成功”回调,而不是一个承诺。
票数 0
EN

Stack Overflow用户

发布于 2013-12-19 05:34:59

要回答真正的问题,只有在维护对延迟和/或代码中某个地方的引用的情况下,才会泄漏内存,而不管您是解决还是拒绝延迟。如果没有引用,那么它将像往常一样被垃圾收集。

尽管如此,我认为在这种情况下,您应该使用.then方法来转换/过滤结果,而不是手动构造延迟。为了这个例子,让我们创建一个名为load的方法,它只是随机地解析或拒绝一个类似于可能会失败的延迟的ajax请求。

代码语言:javascript
复制
function load() {
    return $.Deferred(function( dfr ) {
       if ( Date.now() % 2 ) {
          dfr.resolve( 1 );
       }
       else {
          dfr.reject( "OHNO!" );
       }
    }).promise();
}

现在您能够使用.then来过滤它,如下所示:

代码语言:javascript
复制
var filteredResult = load().then(function( result ) {
    return result * 2;
});

filteredResult现在是一个承诺,如果负载被解析,它会使原来的结果加倍,所以filterResult.done( console.log.bind( console ) )会将2打印到控制台。如果加载失败/被拒绝,那么故障处理程序仍将正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20672972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档