为什么这个Javascript setTimeout和setInterval会进入竞争状态?

为什么这个Javascript setTimeout和setInterval会进入竞争状态?,javascript,carousel,settimeout,setinterval,race-condition,Javascript,Carousel,Settimeout,Setinterval,Race Condition,document.addEventListener(“DOMContentLoaded”),函数(事件){ 窗口设置间隔(RotateCaruel,5000); }); 功能FADECAURSEL(n、e、t、s){ var carousel=window.setInterval(函数(){ 控制台日志(t/s); 如果(e.children[n].style.opacity>0){ e、 children[n].style.opacity=String(parseFloat(e.childre

document.addEventListener(“DOMContentLoaded”),函数(事件){
窗口设置间隔(RotateCaruel,5000);
});
功能FADECAURSEL(n、e、t、s){
var carousel=window.setInterval(函数(){
控制台日志(t/s);
如果(e.children[n].style.opacity>0){
e、 children[n].style.opacity=String(parseFloat(e.children[n].style.opacity)-.01);
}

如果(e.children)[(n+1)%e.childElementCount].style.opacity因为当您更改活动元素时,for循环错误,您的间隔未完成。这就是为什么当下一个元素活动时,您的间隔已清除。以及您的竞争条件。我已修复此代码,我将尝试在清除前向元素间隔后调用set interval next element。请参阅代码截取

var-activeChild=-1;
document.addEventListener(“DOMContentLoaded”),函数(事件){
rotateCarousel();
});
功能FADECAURSEL(n、e、t、s){
var carousel=window.setInterval(函数(){
控制台日志(t/s);
如果(e.children[n].style.opacity>0){
e、 children[n].style.opacity=String(parseFloat(e.children[n].style.opacity)-.01);
}

if(e.children[(n+1)%e.childElementCount].style.opacity Javascript一次只能做一件事(又名:单线程)。使用CSS和转换来控制不透明度。感谢您查看此内容并找出错误。我不明白为什么我所做的会导致此争用。当setInterval正在执行时,for循环是否仍在执行?我不明白为什么或如何发生此情况。RotateCarsel不应该总是在for loop完成了?再次感谢您的洞察力,让它工作很好,但我很想了解这个问题。好的,谢谢,所以我不明白的是“A打电话后B完成5000-(n*500ms)”中的“n”来自哪里。为什么是“5000-(n*500ms)”而不是“5000-(1*500ms)”?我意识到B被调用了多次(A的每个间隔调用一次),但由于在A的每个间隔中,B的周期较短,B不应该总是在调用下一个A之前完成吗?如果B总是第一个完成,n=1,不应该总是吗?B是如何不断地被延迟,使B感觉A调用得更快(因此B不能在下一个A之前完成)?再次感谢您的帮助!