[我发现jQuery animate()
的行为有点像一个承诺,因为一个任务将在执行第二个任务之前首先完成,非常像两个链接的承诺。
div
的html可以在以下代码中的动画完成之前发生的事实,也表明animate()
就像一个承诺-它立即返回并且是非阻塞的。
但是我发现如果我只在具有两个不同动画的元素(animate()
)上两次调用#shape2
,它们将一个接一个地运行,而不是同时具有向下滑动和四舍五入的动画同时发生。实际上,这只是通常的jQuery链,而不是Promise链。
animate()
是一个诺言吗?
((如果是承诺,console.log($("#shape").animate().then)
是否应该打印出undefined
以外的内容?]
作为旁注,它的一种可能的实现方式似乎只是使用setTimeout
或setInterval
,为第一个animate()
执行一系列小动画,也许设置了currentAnimationID
设置为1或某个随机ID值,则第二个animate()
根本不会运行,直到第一个动画完成并将currentAnimationID
设置为2
以便第二个动画开始。
或者也许在内部,第一和第二动画被实现为链接的承诺,并且它们只是自动链接在一起。在这种情况下,这种自动链接不是通常的承诺行为,而可能只是通常的动画要求所需要的。
$("#shape").animate({
top: 100
}, 1000).animate({
borderRadius: 30
}, 1000);
$("#shape2").animate({
top: 100
}, 1000);
$("#shape2").animate({
borderRadius: 30
}, 1000);
$("#shape").html("hello");
$("#shape2").html("world");
#shape, #shape2 {
background-color: #00BFFF;
width: 100px;
height: 100px;
top: 0px;
left: 50px;
position: relative;
border-radius: 0;
display: inline-block;
text-align: center;
line-height: 100px;
vertical-align: middle;
font-size:18px
}
#shape2 {
left: 150px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="shape"></div>
<div id="shape2"></div>
jsfiddle版本位于https://jsfiddle.net/pnkrhxs8/15上,由于某种原因,在jsfiddle版本中,两个正方形同时向下滑动,但是在Stackoverflow版本上,右正方形的滑动速度比左正方形慢一些。
不,这不是一个承诺。它正在fx
queue of the jQuery element中安排一个效果,可以用承诺链不能的方式对其进行操作。
但是,是的,结果与承诺链非常相似,您可以使用fx
获得动画队列末尾的承诺,然后从中开始一个真实的承诺链。
由于它是一个函数调用,所以绝对不是一个承诺。 Promise是具有3种不同状态的对象:未决,已解决,已拒绝。一个Promise拥有访问这些状态的方法:then(),catch()。运营商 ”。”只是在那里访问函数的返回值。这意味着函数可以返回Promise,然后您可以使用.promise()
method
.promise()