我刚刚浏览了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
答案 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
等功能,允许您链接异步计算。