【问题标题】:jQuery: deferred/ promisejQuery:延迟/承诺
【发布时间】:2023-03-21 14:32:01
【问题描述】:

我正在尝试从示例应用中找出主干(请参阅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();
        }

【问题讨论】:

标签: javascript backbone.js


【解决方案1】:

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

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

2) 通过返回 promise.promise(); 会发生什么;是不是在呼唤 延迟方法?什么时候?为什么这样做?这似乎是一个 递归方法?

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

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

是的。 Deferred 只不过是一个允许您注册回调的对象。在 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!'

});

【讨论】:

  • 谢谢,所以如果在 deferred 上调用 resolve() 会触发 done 处理程序,那么 OP 代码中的 done 处理程序是什么?这就是我不明白的。 dfd.resolve 之后似乎什么也没发生
  • @user1647484 - 我没有看到其余的代码,所以我不太清楚,但我的想法似乎是你会在视图上调用 hide 或 show 并链接回调到它上面,这样你就可以保证在动画完成后执行后续动作。
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2019-04-26
相关资源
最近更新 更多