2

我正在尝试使用文档以及其他人编写的代码来找出 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();
        },
    
4

1 回答 1

5

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

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

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

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

这是来自文档的引用

deferred.promise()方法允许异步函数防止其他代码干扰其内部请求的进度或状态。Promise 仅公开附加附加处理程序或确定状态所需的 Deferred 方法(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/

于 2013-01-14T23:28:19.927 回答