在单击时杀死所有正在运行的JavaScript函数

在单击时杀死所有正在运行的JavaScript函数,javascript,function,Javascript,Function,这是我上一个问题的延伸,主要是出于好奇: 我有一个带有3个按钮和“结果”部分的网页: 1st按钮 第二个按钮 第三个按钮 “下面是结果!” 下面是JavaScript函数的代码片段。我还使用了web worker: //函数相似,但输出不同 var工人; 函数calcF1(){ var回答; for(设i=0;i{ document.getElementById(“结果”).innerHTML=“第一个函数”; }; } 函数calcF2(){ var回答; for(设i=0;i{ docum

这是我上一个问题的延伸,主要是出于好奇:

我有一个带有3个按钮和“结果”部分的网页:

1st按钮
第二个按钮
第三个按钮

“下面是结果!”

下面是JavaScript函数的代码片段。我还使用了web worker:

//函数相似,但输出不同
var工人;
函数calcF1(){
var回答;
for(设i=0;i<1e9;i++){
//做一些复杂的计算
}
后消息(回答);
}
函数f1(){
//TODO:终止所有函数的其他运行实例
//呼叫员
var cf1=calcF1.toString();
var code=cf1.substring(cf1.indexOf('{')+1,cf1.lastIndexOf('}'));
var blob=new blob([code],{type:'application/javascript'});
worker=新的worker(URL.createObjectURL(blob));
worker.onmessage=message=>{
document.getElementById(“结果”).innerHTML=“第一个函数”;
};
}
函数calcF2(){
var回答;
for(设i=0;i<1e9;i++){
//做一些复杂的计算
}
后消息(回答);
}
函数f2(){
//TODO:终止所有函数的其他运行实例
//呼叫员
var cf2=calcF2.toString();
var code=cf2.substring(cf2.indexOf('{')+1,cf2.lastIndexOf('}');
var blob=new blob([code],{type:'application/javascript'});
worker=新的worker(URL.createObjectURL(blob));
worker.onmessage=message=>{
document.getElementById(“结果”).innerHTML=“第二个函数”;
};
}
函数calcF3(){
var回答;
for(设i=0;i<1e9;i++){
//做一些复杂的计算
}
后消息(回答);
}
函数f3(){
//TODO:终止所有函数的其他运行实例
//呼叫员
var cf3=calcF3.toString();
var code=cf3.substring(cf3.indexOf('{')+1,cf3.lastIndexOf('}');
var blob=new blob([code],{type:'application/javascript'});
worker=新的worker(URL.createObjectURL(blob));
worker.onmessage=message=>{
document.getElementById(“结果”).innerHTML=“第三个函数”;
};
}
但是,如果用户单击
b1
,然后立即单击
b2
,则
f1
的工作者将不会终止并继续运行。如果
f1
的工作人员在
f2
的工作人员完成之前完成,则
结果
将显示
第一个功能
,然后替换为
第二个功能
。还有一种可能性是,f2的工作人员首先完成,在这种情况下,
结果
将显示
第二个功能
,然后被
第一个功能
取代

我想要的是在每个函数的开头实现一个语句,该语句终止/忽略/绕过当前正在运行的所有函数和/或所有web Worker,以便最终输出始终与用户按下的最后一个按钮关联。如何才能最好地实施它


编辑:感谢您指出网络工作者。我最初的实现涉及网络工作者,但我忘了提及。问题已更新。

将函数拆分,使其仅运行一段时间,然后停止并使用
setTimeout将下一次运行推到堆栈末尾,以便其他函数有机会运行。在每个
f1
f2
f3
的开头,检查它们是否具有对当前运行函数键的唯一引用,如果没有,则返回

在以下代码段中,正在进行的
f1
函数被最近调用的
f2
覆盖:

让runningFunctionKey;
函数f1(键,开始=0){
如果(!键){
runningFunctionKey={};//某个唯一引用
key=运行函数key;
}否则如果(key!==runningFunctionKey)返回;
const until=开始+1e7;
while(开始<直到){
如果(开始===1e9){
console.log('f1 done');
返回;
}
启动++;
}
console.log('f1设置超时');
设置超时(f1,0,键,开始);
}
功能f2(键,开始=0){
如果(!键){
runningFunctionKey={};//某个唯一引用
key=运行函数key;
}否则如果(key!==runningFunctionKey)返回;
const until=开始+1e7;
while(开始<直到){
如果(开始===1e9){
console.log('f2 done');
返回;
}
启动++;
}
console.log('f2设置超时');
设置超时(f2,0,键,开始);
}
f1();

设置超时(F2500)无法从其他函数停止for循环,因为for循环已同步。f1正在运行时,甚至不能启动f2。请注意,除非您使用web workers,否则Javascript只在一个线程中运行。它的可能副本听起来像您想使用。这不是副本。对于这个问题,我问了如何使用
setTimeout()
终止函数,这似乎更容易终止@Ruchernchong是的,我实际上在用一个。我更新了问题以反映这一点@PatrickRoberts
Symbol()
可能是一个更好的选择,可以使用一个轻量级的唯一密钥,但我认为这将是解决问题的方法。回答不错!当你必须定期检查的时候,这看起来确实有点效率低下,但肯定会奏效@Mushinako如果重新检查频率是一个问题,请随意增加执行持续时间(例如1e8,而不是当前的
直到=start+1e7
),尽管考虑到这种实现,更频繁的重新检查将有助于更快地响应用户操作。