Я пытаюсь воспроизвести звук и переключить класс определенных элементов в определенном порядке. Каждый элемент должен иметь добавленный класс, воспроизводить звук, а затем удалять класс, прежде чем продолжать делать то же самое в следующем элементе.Последовательно активируйте определенные элементы с динамически построенной цепочкой обещаний jQuery
Ниже один из способов сделать это:
var delay = 400;
$('#green').toggleClass('active').delay(delay).promise().done(function() {
playSound(this[0].id);
$(this).toggleClass('active');
$('#red').toggleClass('active').delay(delay).promise().done(function() {
playSound(this[0].id);
$(this).toggleClass('active');
$('#blue').toggleClass('active').delay(delay).promise().done(function() {
playSound(this[0].id);
$(this).toggleClass('active');
$('#yellow').toggleClass('active').delay(delay).promise().done(function() {
playSound(this[0].id);
$(this).toggleClass('active');
});
});
});
});
Я бы предпочел, чтобы просто передать массив идентификаторов элементов для генерации выше код динамически. Основываясь на многих связанных с этим ответах, я считаю, что этот код больше в правильном направлении, но все работает сразу.
startAnimation();
function playSound(color) {
var sound = document.getElementById(color + 'Sound');
sound.load();
sound.play();
}
function computerClick(color) {
playSound(color);
$('#' + color).toggleClass('active').delay(500).promise().done(function() {
$('#' + color).toggleClass('active');
});
}
function startAnimation() {
var colors = ['green', 'red', 'blue', 'yellow'];
var p = $.when(1);
var results = [];
colors.forEach(function(color) {
p = p.then(function() {
return computerClick(color);
});
});
}
Может кто-то здесь сказать мне, что я делаю неправильно, или если мне нужен совершенно другой подход?
Вы можете использовать '.queue()', чтобы вызвать множество функций последовательно. В 'js' at Question, объект обещания jQuery, похоже, не возвращается из' computerClick() '? – guest271314