2015-02-24 2 views
0

Надеюсь, вы можете дать мне быстрое решение для чего-то, с чем я борюсь. Я нашел странного человека с аналогичной проблемой, но не могу окунуться в то, что явно не может быть так сложно!jQuery - ждет setTimeout перед следующим запуском .each()

Я ищу кода ниже, чтобы ждать, пока setTimeout закончил, прежде чем он возвращается к следующему .each()

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

Я предполагаю, что какое-то очередь поможет, но я определенно не Эксперт jQuery! Ответы, которые я видел, похоже, связаны с анимацией, чего нет, поэтому я приношу свои извинения, если я пропустил что-то очевидное в своих предыдущих поисках. Приветствия.

ответ

0

Как оказалось, мне не нужно на самом деле блокировать цикл .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); 
}); 
2

его очень просто.

Вам необходимо предоставить счетчик с этой функцией. так:

$('.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

и так далее.

см работает fiddle тоже:

привет Тимофея!

+0

Это работает очень хорошо, гораздо лучше, чем мое предложение – Jacob

+0

Это было бы здорово, за исключением продолжительности задержки изменяется каждый раз. Думаю, я справился с этим сразу после того, как я опубликовал вопрос, но с тех пор у меня не было возможности попробовать. Я думаю, что я просто буду следить за общей задержкой и добавить это к необходимой задержке для каждого элемента. Должен работать для странного, целенаправленного ужасного пользовательского опыта, который мне нужен. Я отчитаю! –

0

each цикл не ждет, пока setTimeout переместится на следующий элемент, поскольку он предназначен для неблокирующего выполнения нескольких «потоков» (хотя JS на самом деле не многопоточен).

Каждый будет устанавливать отдельные параллельные таймеры для каждого элемента в вашем списке до первого запуска setTimeout. Целью setTimeout является то, что код, вызывающий ее, выполняется без прерывания и выполняет первый параметр, когда происходит таймаут.

Если вы хотите перейти к следующему элементу, когда тайм-аут завершен, вы должны сделать это вручную, не используя $.each(). Таким образом, вы контролируете скорость, с которой выполнение переходит к следующему согласованному элементу.

Вы можете перебирать каждый элемент на согласованном наборе (используя цикл for... in) и использовать sleep (xxxx); Однако имейте в виду, что сон будет заморозить выполнение до тех пор, пока задержка не закончится, поэтому может быть не так, как вы хотите, с точки зрения пользователя.

0

Вы всегда можете использовать JQuery delay() метод:

$.each($('.foo'), function(i, item) { 
    $(item).delay(1000 * i).fadeIn(); 
}); 

Это будет исчезать в следующем .foo элемента каждую секунду.

Demo: http://jsfiddle.net/m0fxm2Lu/