2012-09-30 126 views
2

我试图从示例应用程序中找出主干(请参阅https://github.com/elfsternberg/The-Backbone-Store)。代码使用jQuery的Deferred和promise(),如您在下面的代码中看到的。我已经阅读了关于jQuery的文档,但从下面的示例中找出如何使用这些方法时遇到困难。你可能需要更多的代码来回答这个问题,但也许不需要。这些是我有关于它的问题jQuery:推迟/承诺

1)是否dfd.resolve调用一次fadeOut完成?如果是这样,dfd.resolve触发器是什么?

2)返回的信息promise.promise();它是否调用延迟方法?什么时候?为什么这样做?这似乎是一个递归方法?

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(); 
     } 
+0

对于第二个问题,看http://stackoverflow.com/q/8073528/1048572 – Bergi

回答

4

1)一旦淡出完成被称为dfd.resolve?如果是这样的话, dfd.resolve触发器是什么?

是的。jQuery.fadeOut将回调作为其参数之一。一旦动画完成,它将执行回调。在这种情况下,恰好是延期的解决方法。

2)返回的信息promise.promise();它是否调用 延迟方法?什么时候?为什么这样做?这似乎是一个 递归方法?

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

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

是的。 Deferred只不过是一个允许您注册回调的对象。拨打.resolve()延期将触发done handlers,而呼叫.reject()将触发任何fail handlers

一个很简略的例子可能是这样的:

//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!' 

}); 
+0

感谢,所以如果在推迟调用解析()将触发完成的处理程序,OP中的代码中完成的处理程序是什么?这是我不明白的。在dfd.resolve – BrainLikeADullPencil

+0

@ user1647484之后似乎没有任何事情发生 - 我还没有看到代码的其余部分,所以我不太清楚,但我认为这个想法似乎是,你会调用隐藏或显示视图和链回调它,这样你可以保证在动画完成后执行后续动作。 – Josh