了解animateSlider.js中$ .resolve的用法

时间:2015-10-03 15:27:16

标签: javascript jquery

我刚刚浏览了animateSlider.js的代码并遇到了以下代码行:

animDuration:   function(page)
        {
            var $slideAnimations            =   this.slides.eq(page);
            var slideAnimationsCount        =   $slideAnimations.children("*.animated").length;
            var animationStart              =   +new Date();

            // DIFF :: understand what $.Deferred() is used for ?
            var promise                     =   new $.Deferred();
            var animationTime,count         =   0;
            $slideAnimations.on("animationend webkitAnimationEnd oanimationend MSAnimationEnd",function()
                {
                    var animationEnd    =   +new Date();
                    animationTime       =   Math.ceil((animationEnd -animationStart)/1000)*1000;
                    count++;
                    if (count == slideAnimationsCount)
                    {
                        // DIFF :: understand what resolve is used for ?
                        promise.resolve(animationTime);
                    }
                });
            return promise;
        }

上面的函数被调用如下:

    this.animDuration(page).done(function(animationTime)

现在我的问题是参数animationTime如何传递给done()函数?

如果我浏览代码,就会出现一个新的deffered实例:

var promise =   new $.Deferred();

并且比如下:

promise.resolve(animationTime);

resolve传递animationTime参数,并且返回promise,如下所示:

return promise;

但我仍然不太了解谁将animationTime传递给了done()函数,有人可以解释一下吗?

可以看到关注的代码行 HERE

谢谢。

亚历-Z

1 个答案:

答案 0 :(得分:1)

这是promise model of asynchronous programming。虽然它已成为language的一部分,但您看到的是jQuery implementation of this interface。如果您阅读了所有这些参考文献,您将了解它在您的案例中的用法。

但是,为了给你一个入门读物,请考虑这个经典的$.ajax函数

$.ajax({url: ..., success: function(animationTime){} });

问问自己"什么是传递动画时间"成功回调?那么很难想象上面这段代码的代码

$.ajax1({url: ...}).on('success', function(animationTime){});

从那一小步到

$.ajax2({url: ...}).success(function(animationTime){})

不是吗? :)那就是承诺。它实现了一个接口,有时称为thennable,它具有done等功能,允许您链接异步计算。