jQuery animate()是一个承诺吗?

问题描述 投票:0回答:2

[我发现jQuery animate()的行为有点像一个承诺,因为一个任务将在执行第二个任务之前首先完成,非常像两个链接的承诺。

div的html可以在以下代码中的动画完成之前发生的事实,也表明animate()就像一个承诺-它立即返回并且是非阻塞的。

但是我发现如果我只在具有两个不同动画的元素(animate())上两次调用#shape2,它们将一个接一个地运行,而不是同时具有向下滑动和四舍五入的动画同时发生。实际上,这只是通常的jQuery链,而不是Promise链。

animate()是一个诺言吗?

((如果是承诺,console.log($("#shape").animate().then)是否应该打印出undefined以外的内容?]

作为旁注,它的一种可能的实现方式似乎只是使用setTimeoutsetInterval,为第一个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版本上,右正方形的滑动速度比左正方形慢一些。

jquery promise jquery-animate
2个回答
1
投票

不,这不是一个承诺。它正在fx queue of the jQuery element中安排一个效果,可以用承诺链不能的方式对其进行操作。

但是,是的,结果与承诺链非常相似,您可以使用fx获得动画队列末尾的承诺,然后从中开始一个真实的承诺链。


1
投票

由于它是一个函数调用,所以绝对不是一个承诺。 Promise是具有3种不同状态的对象:未决,已解决,已拒绝。一个Promise拥有访问这些状态的方法:then(),catch()。运营商 ”。”只是在那里访问函数的返回值。这意味着函数可以返回Promise,然后您可以使用.promise() method

访问Promise对象的then()方法
.promise()
© www.soinside.com 2019 - 2024. All rights reserved.