Напишем функцию перебора с задержкой элементов массивоподобного объекта, чтобы можно было делать так:
forEachWithDelay(
document.querySelectorAll('.x'),
1000,
el => el.style.display = 'block'
);
Какие тут есть варианты:
Раз - таймауты сразу для всех элементов:
function forEachWithDelay(arr, delay, callback) {
Array.prototype.forEach.call(arr, (n, i) => {
setTimeout(callback, (i + 1) * delay, n);
});
}
Два - рекурсивные таймауты, следующий назначается в коллбеке предыдущего:
function forEachWithDelay(arr, delay, callback) {
(function next(i) {
if (i < arr.length) {
setTimeout(() => {
callback(arr[i]);
next(-~i);
}, delay);
}
})(0);
}
Три - интервал:
function forEachWithDelay(arr, delay, callback) {
let i = -1;
const intervalId = setInterval(() => {
if (++i < arr.length) {
callback(arr[i]);
} else {
clearInterval(intervalId);
}
}, delay);
}