![](/img/trans.png)
[英]The eventloop in JavaScript, why is there inconsistent behaviour in setTimeout
[英]javascript - recursive setTimeout results in inconsistent behaviour
我有一个setTimeout
在递归函数中被调用:
var recursiveTimer = function(duration, data) {
anotherFunction(data);
setTimeout(function() {
// Do stuff with data
data = {};
recursiveTimer(duration, data);
}, duration);
};
这里的问题是我的anotherFunction
并不总是被调用。 我体验到每隔recursiveTimer
运行一次就会被调用。
怎么可能?
编辑 :
我的anotherFunction()
真正做的是,它使用jQuery动画了一个dom元素。 像这样:
$('#slider .slider-loader').find('.bg').css('width', "0%");
currentLoader.find('.bg').animate({
width: "100%"
}, 3000);
第一行是问题所在。 它不是被解雇每一次,只有每个其他时间。
根据您的评论和编辑您的问题是,您观察到错误的行为后, .bg
仍会显示动画。
JQuery存储已设置动画的属性的初始值,并使用它们直到完成动画为止。 因此,设置当前动画的css属性无效。
为避免此问题,必须在更改之前停止元素的动画,然后设置css属性:
$('#slider .slider-loader').find('.bg').stop(true).css('width', "0%");
有两种方法可以用来清除队列jQuery.clearQueue和jQuery.stop
动画时间和超时时间的注释。 如果设置了动画的持续时间3000ms
动画也可能会持续3010ms
(甚至更长时间),同样适用于setTimeout
,所以你永远不应该在它的准确性计数。
超时与动画相同
你不应该那样做。 相反,请使用animate()
方法的complete
回调参数:
var bg = $('#slider .slider-loader').find('.bg');
var recursiveTimer = function(duration, data) {
bg.animate({
width: "100%"
}, 3000, function() {
// Do stuff with data
data = {};
bg.css('width', "0%");
recursiveTimer(duration, data);
});
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.