2017-02-14 2 views
0

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

var turn = 19; 
var b = 0; 
function flash(button, light) { 
button.addClass(light).delay(500).queue(function(){button.removeClass(light);}) 
    } 

    function lightUp() { 
switch (game[b]) { 
    case 1: 
    one.play(); 
    flash($("#1"),"onelit"); 
    break; 
    case 2: 
    two.play(); 
    flash($("#2"),"twolit"); 
    break; 
    case 3: 
    three.play(); 
    flash($("#3"),"threelit"); 
    break; 
    case 4: 
    four.play(); 
    flash($("#4"),"fourlit"); 
    break; 
} 

b++; 
if (b < turn) { 
    setTimeout(lightUp, 2000); 
} 
    } 
+0

ОК, так что, как представляется, он выполняет только одну функцию после задержки один раз, а затем во второй раз, когда каждая кнопка загорается, она не возвращается к исходному цвету. – Keli

+0

Возможно, проблема заключается в том, что вы не вызываете 'next () ', как в [этом ответе] (http://stackoverflow.com/a/2510255/859640). Кстати, вам действительно следует избегать использования оператора switch. Вот [jsfiddle] (https://jsfiddle.net/31bb0azk/1/), который может дать вам некоторые идеи. –

+0

Спасибо, что следующий() решил! Является ли оператор switch таким же неуклюжим? – Keli

ответ

1

JQuery documentation for the .queue() function показывает, что функция обратного вызова передается функция, которая при вызове «будет DEQUEUE следующий пункт». Вы должны вызвать эту функцию в конце вашего обратного вызова. (BTW: Распространено имя параметра "рядом".)

function flash(button, light) { 
    button.addClass(light).delay(500).queue(function(next) { 
     button.removeClass(light); 
     next(); 
    }); 
} 

Благодаря this answer.

Смежные вопросы