jQuery– ;在下次运行.each()之前等待setTimeout

jQuery– ;在下次运行.each()之前等待setTimeout,jquery,Jquery,我希望你能给我一个快速修复的东西,我正在挣扎。我已经找到了一个有类似问题的奇怪的人,但是我无法理解一些显然不会那么困难的事情 我正在寻找下面的代码,直到setTimeout完成后再循环到下一个。each() 我假设某种队列会有所帮助,但我绝对不是jQuery专家!我看到的答案似乎是关于动画的,而这不是,所以如果我在以前的搜索中遗漏了一些明显的东西,我道歉。干杯。这很简单 您需要提供一个具有该功能的计数器。因此: $('.someClass').each(function(i) { var

我希望你能给我一个快速修复的东西,我正在挣扎。我已经找到了一个有类似问题的奇怪的人,但是我无法理解一些显然不会那么困难的事情

我正在寻找下面的代码,直到
setTimeout
完成后再循环到下一个
。each()

我假设某种队列会有所帮助,但我绝对不是jQuery专家!我看到的答案似乎是关于动画的,而这不是,所以如果我在以前的搜索中遗漏了一些明显的东西,我道歉。干杯。

这很简单

您需要提供一个具有该功能的计数器。因此:

$('.someClass').each(function(i) {
    var thisWindow = $(this);
    var someDelay = 500;
    setTimeout(function(){
        thisWindow.removeClass('hidden');
        console.log($(this));
     },i * someDelay);  
});
有了这个i和最后的小计算,每个元素都会得到500毫秒的延迟

因此,对于第一次演练:

0*500=0

第二:

1*500=500

第三:

2*500=1000

等等

也请参见工作:


提摩太安

每个
循环都不会等待setTimeout移动到下一项,因为它意味着几个“线程”的非阻塞执行(尽管JS不是真正的多线程)

在第一个
setTimeout
开始触发之前,每个元素都将为列表中的每个元素设置单独的并行计时器。
setTimeout
的目的是让调用它的代码不中断地继续进行,并在超时发生时执行第一个参数

如果要在超时完成时前进到下一个元素,则必须手动执行,而不是使用
$.each()
。这样,您就可以控制执行移动到下一个匹配项的速率


您可以迭代匹配集上的每个元素(使用
for…in
循环)并使用sleep(xxxx);但是,请注意,睡眠将冻结执行,直到延迟结束,因此从用户体验的角度来看,这可能不是您想要的。

您可以始终使用jquery
delay()
方法:

$.each($('.foo'), function(i, item) {
    $(item).delay(1000 * i).fadeIn();
});
这将在下一个.foo元素中每秒消失


Demo

事实证明,我不需要为我的特定用途实际阻止
.each()
循环。我只是记录了“totalDelaySoFar”,并将其添加到每个项目的延迟中,以便它们在正确的时间完成运行

我的结局是:

var totalDelay = 0;
$('.someClass').each(function() {
    var thisWindow = $(this);
    var someDelay = totalDelay + someOtherVariable;
    totalDelay += someDelay;
    setTimeout(function(){
        thisWindow.removeClass('hidden');
        console.log($(this));
    },someDelay);  
});

这真的很好,比我的建议要好得多。那太好了,只是每次延迟的持续时间都会改变。我想我是在发布问题后才解决的,但从那以后我就没有机会尝试过。我想我只需要跟踪总延迟,并将其添加到每个元素的必要延迟中。应该适用于我所需要的奇怪、故意糟糕的用户体验。我会回来报到的!
var totalDelay = 0;
$('.someClass').each(function() {
    var thisWindow = $(this);
    var someDelay = totalDelay + someOtherVariable;
    totalDelay += someDelay;
    setTimeout(function(){
        thisWindow.removeClass('hidden');
        console.log($(this));
    },someDelay);  
});