2

我正在尝试从示例应用程序中找出主干(请参阅https://github.com/elfsternberg/The-Backbone-Store)。该代码使用 jQuery 的 Deferred 和 promise(),如下面的代码所示。我已经阅读了有关 jQuery 的文档,但是无法从下面的示例中弄清楚如何使用这些方法。您可能需要更多代码来回答这个问题,但也许不需要。这些是我对此的疑问

1) dfd.resolve 是在fadeOut 完成后调用的吗?如果是这样,dfd.resolve 会触发什么?

2) 通过返回 promise.promise() 会发生什么;它是在调用 Deferred 方法吗?什么时候?为什么这样做?这似乎是一种递归方法?

3) dfd.resolve 是否有可能触发此代码中未显示的其他方法?

      hide: function() {
            if ((":visible") === false) {

                return null;

            }
            promise = $.Deferred(_.bind(function(dfd) { 
                this.el.fadeOut('fast', dfd.resolve)}, this));
            return promise.promise();
        },

        show: function() {
            if (this.el.is(':visible')) { 
                return;
            }       
            promise = $.Deferred(_.bind(function(dfd) { 
                console.log("in promise section of show in base view");
                this.el.fadeIn('fast', dfd.resolve) }, this))
            return promise.promise();
        }
4

1 回答 1

4

1) dfd.resolve 是在fadeOut 完成后调用的吗?如果是这样,dfd.resolve 会触发什么?

是的。 jQuery.fadeOut接受一个回调作为它的参数之一。一旦动画完成,它将执行回调。在这种情况下,它恰好是 Deferred 的 resolve 方法。

2) 通过返回 promise.promise() 会发生什么;它是在调用 Deferred 方法吗?什么时候?为什么这样做?这似乎是一种递归方法?

这里没有递归promise只是一个变量,它包含对创建的 Deferred 对象的引用。promise()是 a 上的一个方法,jQuery.Deferred它返回不允许您修改其行为方式的 Deferred 的修改版本。因此,调用者可以确保它将始终以相同的方式执行。

3) dfd.resolve 是否有可能触发此代码中未显示的其他方法?

是的。Deferred 只不过是一个允许您注册回调的对象。调用.resolve()Deferred 将触发done 处理程序,而调用.reject()将触发任何失败处理程序

一个非常简写的示例可能如下所示:

//A Deferred takes in a function that will be passed a reference
// to the Deferred object. This allows you to resolve or reject
// it at some point in the future.
var promise = $.Deferred(function(def){

   setTimeout(function(){

      def.resolve('Five seconds have passed!');      

   }, 5000);

}).promise();

//This will only get executed when the
// underlying Deferred gets resolved
promise.done(function(msg){

   alert(msg); // Displays: 'Five seconds have passed!'

});
于 2012-09-30T04:51:16.917 回答