【问题标题】:Run all instances of function one at a time, prevent function from interrupting itself一次运行一个函数的所有实例,防止函数中断自己
【发布时间】:2023-03-06 16:31:01
【问题描述】:

目前,JavaScript 一键即可完美运行。但是,当我在该功能已经运行时单击“测试测试”按钮时,它似乎会自行中断。我希望第二次点击自行排队并等到“谢谢!”消失了。在“谢谢!”之后从第一次点击消失,然后,只有这样,我希望第二次点击再次运行该功能。

这应该适用于所有后续点击。如果我非常快速地连续点击按钮 5 次,完整的功能应该按顺序播放 5 次,而不是重叠自身并且只输入一个“谢谢”。

这里是演示形式的 JS: https://jsfiddle.net/p562thwe/

let egg = document.querySelector("#egg");
let petEffects = document.querySelector("#streamPet");

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

document.querySelector("#button").onclick = async function demo() {
    egg.classList.add("bounce");
  await sleep(3000);
    egg.classList.remove("bounce");
    petEffects.innerText = `Wowee!`;
    petEffects.classList.add("typing");
  await sleep(2000);
    petEffects.innerText = ``;
    petEffects.classList.remove("typing");
  await sleep(100);
    petEffects.innerText = `Thank you!`;
    petEffects.classList.add("typing");
  await sleep(3000);
    petEffects.innerText = ``;
    petEffects.classList.remove("typing");
}

demo();

我尝试添加一个布尔值,但我无法让它工作,我也不认为它会“排队”下一个实例。

【问题讨论】:

    标签: javascript function async-await queue subsequence


    【解决方案1】:

    您可以完全构建:队列。

    const queue = [];
    let running = false;
    
    function run() {
      if (queue.length > 0) {
        running = true;
        const next = queue.shift();
        next().then(run); // this will call run again when the promise is "done"
      } else {
        running = false;
      }
    }
    
    async function demo() {
      ...
    }
    
    document.querySelector("#button").onclick = function() {
      queue.push(demo);
      if (!running) {
        run();
      }
    };
    

    【讨论】:

    • 这真的很酷,我从未见过构建队列系统。但是,我不确定在哪里插入我的其余代码。我试图将它添加到 run();但我觉得我做错了什么。我将继续尝试,但希望能朝着正确的方向轻推。我还添加了上面和下面的代码,结果不同,都不好。
    • 只要在某个地方定义你的函数。我更新了示例。
    • 谢谢,但我已经尝试过了。 jsfiddle.net/p562thwe/2我觉得我遗漏了一些非常明显的东西,对不起!
    • 哦,我搞定了!反正99%。非常感谢。我接受了你的回答。
    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2014-05-31
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多