【问题标题】:passing deferred into a jquery function将 deferred 传递给 jquery 函数
【发布时间】:2013-01-14 23:25:30
【问题描述】:

我正在尝试使用文档以及其他人编写的代码来找出 jQuery 的延迟 api,但发现它非常混乱。不知道看看下面的函数,你可以解释一下

  1. dfd.resolve 有什么意义。这是否意味着淡出已完成,即仅在淡出完成后才执行?这是将延迟对象传递给 jQuery fadeOut 函数吗?

  2. 当 promise.promise(); 时会发生什么被退回?为什么调用 promise();在 promise 属性上?

    你能解释一下这段代码吗

    hide: function() {
            if (this.el.is(":visible") === false) {
                return null;
            }
            promise = $.Deferred(_.bind(function(dfd) {
                this.el.fadeOut('fast', dfd.resolve)}, this));
            return promise.promise();
        },
    

【问题讨论】:

    标签: jquery jquery-deferred


    【解决方案1】:

    你是对的。 dfd.resolve 作为回调传递给fadeOut,这样当淡出完成时,promise 就会解析。

    promise = $.Deferred 具有误导性,因为 $.Deferred 返回一个 Deferred 对象,而不是一个承诺。在 deferred 上调用 .promise() 将返回一个承诺。

    deferred 和 promise 之间的区别在于,promise 仅用于注册回调(通过alwaysdonefailpipeprogressthen),而原来的 deferred 对象也有一个resolve 方法。

    总结promise 与原来的deferred 相同,只是减去了resolve 方法(及其相关方法)。这用于保护您的promise,以便您是唯一有能力解决/拒绝它的人。调用者所能做的就是给它添加回调函数。

    这里是a quote from the docs

    deferred.promise() 方法允许异步函数防止其他代码干扰其内部请求的进度或状态。 Promise 仅公开附加附加处理程序或确定状态所需的延迟方法(thendonefailalwayspipeprogressstate),但不公开更改状态(resolverejectnotifyresolveWithrejectWithnotifyWith)。


    为了简化这一点,让我们删除下划线绑定:

    function hide () {
      var deferred = $.Deferred(function(dfd) {
        $('div').fadeOut('slow', dfd.resolve)
      });
    
      return deferred.promise();
    }
    
    hide().then(function () {
      alert('Fade out is done!');
    });
    

    这是小提琴:http://jsfiddle.net/fDUej/

    【讨论】:

    • 这是隐藏视图元素的代码。在这种情况下,“承诺解决”意味着什么。 promise(); 时触发了什么运行?但返回的应许是什么?一定要发生什么事?什么?
    • 确实调用了 promise();触发 dfd.resolve?如果是这样,那会发生什么?
    • @BrainLikeADullPencil - 解决承诺后什么都不会发生,除非您在该承诺上注册回调。
    • @BrainLikeADullPencil - 从延迟对象中调用promise() 删除 .resolve。 (实际上,它只是返回一个不同的对象,其中包含普通 deferred 可用的方法子集)
    • 谢谢,我已经阅读了文档,但是对于一个相对缺乏经验的开发人员来说,这有点抽象。我希望语言更简单。
    猜你喜欢
    • 2011-12-07
    • 2013-06-25
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多