处理JavaScript函数执行取消的最佳方法

处理JavaScript函数执行取消的最佳方法,javascript,asynchronous,settimeout,cancellation,cleartimeout,Javascript,Asynchronous,Settimeout,Cancellation,Cleartimeout,我有三个职能: let timeVar; let savedFunctionCode; function startTimer(code) { savedFunctionCode = code; timeVar = setTimeout(savedFunctionCode, 2000); } function resumeTimer(intervalTime = 2000) { setTimeout(savedFunctionCode, intervalTime); } function

我有三个职能:

let timeVar;
let savedFunctionCode;

function startTimer(code) {
savedFunctionCode = code;
timeVar = setTimeout(savedFunctionCode, 2000);
}

function resumeTimer(intervalTime = 2000) {
setTimeout(savedFunctionCode, intervalTime);
}

function stopTimer() {
clearTimeout(timeVar);
}
这基本上是一种暂停和恢复特定代码的方法

现在,在实例化计时器之后(通过调用startTimer),可以暂停或恢复代码

如果方法stopTimer()和resumeTimer()的调用间隔至少两秒,暂停和恢复代码执行的预期行为就会起作用。

但是,如果按该顺序调用resumeTimer()和stopTimer()的时间间隔小于两秒,则stopTimer()将无法成功停止/暂停resumeTimer()的预期执行

我的理论是:

在暂停状态下,当调用resumeTimer时,代码将在两秒钟内执行。但是,如果快速执行stopTimer(),基本上没有什么可以停止的,因为resumeTimer的代码执行尚未开始。(不到两秒钟)

因此,在两秒钟内,resumeTimer()方法执行其代码,因为stopTimer()不会影响它

问题:在JavaScript中是否有一种方法可以在执行stopTimer()时取消所有挂起的代码执行。因此,在本例中,我希望stopTimer()取消在2秒内执行的resumeTimer()代码

请说明这是否不清楚

例如:

<html>
<body>
 <div id="media-holder">
<span id="play-button" onclick="resumeTimer();"></span>
<span id="pause-button" onclick="stopTimer();"></span>
</div>


<script>
let timeVar = setTimeout(execute, 2000); 

function resumeTimer(intervalTime = 2000) {
    setTimeout(execute, intervalTime);
}

function stopTimer() {
    clearTimeout(timeVar);
}

function foo() {
    for(let i = 0; i < 100; i++) {
        console.log("execute");
    }
}

</script>
 <html>

设timeVar=setTimeout(execute,2000);
功能恢复计时器(间隔时间=2000){
设置超时(执行,间隔时间);
}
函数stopTimer(){
clearTimeout(timeVar);
}
函数foo(){
for(设i=0;i<100;i++){
console.log(“执行”);
}
}

如果快速单击play按钮和pause按钮,它仍然会继续执行foo()方法,

JavaScript是单线程的。在执行过程中,不能中断一个函数,因为它阻止线程调用<代码> OnCase<代码>回调,直到执行完成。< /P> 但是,您可以使用以下方法设计可中断功能:

函数resumeTimer(){
task.resume();
}
函数stopTimer(){
任务暂停();
}
//“*”表示这是一个生成器函数
函数*foo(){
设i=0;
while(true){
//每个“收益”语句都是一个要点
//控制流中断的地方
yieldconsole.log(i++);
}
}
课堂任务{
构造函数(迭代器,ms=16,autoplay=true){
this.step=this.step.bind(this);
this.iterator=迭代器;
这个.ms=ms;
如果(自动播放){
这个是resume();
}
}
步骤({
this.result=this.iterator.next((this.result |{}).value);
}
暂停(){
如果(本参考文件){
clearInterval(此.ref);
this.ref=null;
}
}
恢复(ms=this.ms){
如果(ms!==此.ms){
这个。暂停();
这个.ms=ms;
}
如果(!this.ref){
这个步骤();
this.ref=设置间隔(this.step,this.ms);
}
}
}
让任务=新任务(foo())
播放

暂停
您能提供一个?看到您描述的问题实际发生,将非常有助于解释问题所在以及您的期望。我已更新了我的问题。可能重复感谢,我将看到此方法。我一直在研究承诺,它们是如何实现的?@DylanWhite您可以使用
async/await
,方法与
function*/yield
类似,但是为
async/await
编写一个可以无限期暂停函数控制流的方法并不是那么简单,如果我没有弄错的话,具有无限循环的
async
函数永远不能标记为垃圾收集,因为它的其余控制流依赖于挂起的承诺。一个简单的问题是,有没有办法使它立即启动?现在,它在'ms'变量的持续时间之后开始。如果我想在执行时更改执行的间隔时间,是否有一种方法可以让它立即开始并在通过“ms”进行一致迭代后执行?如果我想在执行时更改执行的间隔时间,是否可以像调用resume函数一样简单,但要用一个参数声明时间并将其传递给setInterval参数?@DylanWhite如果您有任何其他请求,请问一个新问题。