有没有办法简化多个 setTimeout 函数?

is there a way to simplify multiple setTimeout functions?

我有多个 setTimeout 函数,这让我的代码看起来又懒又长。有没有办法简化这个?

window.setTimeout(function () {
  $('.b1, .t5').addClass('active');
}, 3000);
window.setTimeout(function () {
  $('.b1, .t5').removeClass('active');
}, 3200);

window.setTimeout(function () {
  $('.b2, .t4').addClass('active');
}, 3100);
window.setTimeout(function () {
  $('.b2, .t4').removeClass('active');
}, 3300);

window.setTimeout(function () {
  $('.b3, .t3').addClass('active');
}, 3200);
window.setTimeout(function () {
  $('.b3, .t3').removeClass('active');
}, 3400);

window.setTimeout(function () {
  $('.b4, .t2').addClass('active');
}, 3300);
window.setTimeout(function () {
  $('.b4, .t2').removeClass('active');
}, 3500);

您可以使用箭头函数将每个语句减少到一行:

window.setTimeout(() => $(".b1, .t5").addClass("active"),    3000);
window.setTimeout(() => $(".b1, .t5").removeClass("active"), 3200);
window.setTimeout(() => $(".b2, .t4").addClass("active"),    3100);
window.setTimeout(() => $(".b2, .t4").removeClass("active"), 3300);
window.setTimeout(() => $(".b3, .t3").addClass("active"),    3200);
window.setTimeout(() => $(".b3, .t3").removeClass("active"), 3400);
window.setTimeout(() => $(".b4, .t2").addClass("active"),    3300);
window.setTimeout(() => $(".b4, .t2").removeClass("active"), 3500);

但是由于这个接缝就像一个可重复的算法,您可以使用 for 循环:

for (let i = 0; i < 4; i++) {
    const element = $(`.b${i + 1}, .t${5 - i}`);
    window.setTimeout(() => element.addClass('active'),    3000 + i * 100);
    window.setTimeout(() => element.removeClass('active'), 3200 + i * 100);
}

由于所有 类 和超时都遵循简单的模式,您可以使用循环。

for (let i = 0; i < 4; i++) {
    setTimeout(function() {
        $(`.b${1+i}, .t${5-i}`).addClass("active");
    }, 3000 + i*100);
    setTimeout(function() {
        $(`.b${1+i}, .t${5-i}`).removeClass("active");
    }, 3200 + i*100);
}

这个怎么样,


const actions = [
    { class: ".b1, .t5", classParam: "active", addTimeout: 3000, removeTimeout:3200 },
    { class: ".b2, .t4", classParam: "active", addTimeout: 3100, removeTimeout:3100 },
    { class: ".b3, .t3", classParam: "active", addTimeout: 3200, removeTimeout:3400 },
    { class: ".b4, .t2", classParam: "active", addTimeout: 3300, removeTimeout:3500 },
];

for (let i = 0; i < actions.length; i++) {
    let el = actions[i];
    window.setTimeout(function () {
        $(el.class).addClass(el.classParam);
    }, el.addTimeout);
    window.setTimeout(function () {
        $(el.class).addClass(el.classParam);
    }, el.removeTimeout);
}

请让我知道您对此有何看法。 类 将来可能会有所不同,并且可能不会遵循某种模式。