传递延迟到jquery函数

时间:2013-01-14 23:25:31

标签: jquery jquery-deferred

我正在尝试使用docs和其他人编写的代码来解决jQuery的延迟api,但发现它非常令人困惑。我想知道如果看下面的函数,你可以解释一下

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

  2. 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();
        },
    

1 个答案:

答案 0 :(得分:5)

你是对的。 dfd.resolve作为回调传递给fadeOut,因此当淡出完成时,承诺将会解决。

promise = $.Deferred具有误导性,因为$.Deferred会返回Deferred个对象,而非承诺。在延期时调用.promise()将返回一个承诺。

延迟和承诺之间的区别在于,承诺仅用于注册回调(通过alwaysdonefailpipe,{{1 }},或progress),而原始延迟对象也有then方法。

总结resolve与原始promise相同,减去deferred方法(及其相关方法)。这用于保护您的resolve,这样您就是唯一一个能够解析/拒绝它的人。调用者可以做的就是为它添加回调函数。

这是a quote from the docs

  

promise方法允许异步函数阻止其他代码干扰其内部请求的进度或状态。 Promise仅公开附加其他处理程序或确定状态所需的延迟方法(deferred.promise()thendonefailalways,{{1 }}和pipe),但不会改变状态(progressstateresolverejectnotifyresolveWith)。


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

rejectWith

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