如何仅在web浏览器中运行javascript函数而不处理该函数
我的一个javascript函数正在处理数以百万计的数据,在硬件事件中每秒调用一次。然后,web浏览器在该函数处理过程中处于空闲状态 我尝试设置运行(或不运行)该函数的标志:如何仅在web浏览器中运行javascript函数而不处理该函数,javascript,performance,cross-browser,Javascript,Performance,Cross Browser,我的一个javascript函数正在处理数以百万计的数据,在硬件事件中每秒调用一次。然后,web浏览器在该函数处理过程中处于空闲状态 我尝试设置运行(或不运行)该函数的标志: if (!is_calculating) is_calculating = true; else return; my_function(); // do heavy stuff is_calculating = false; 但它不工作,因为它正在输入代码,而web浏览器在完成之前处于空闲状态。
if (!is_calculating)
is_calculating = true;
else
return;
my_function(); // do heavy stuff
is_calculating = false;
但它不工作,因为它正在输入代码,而web浏览器在完成之前处于空闲状态。当它返回时,标志总是OK的,因为它完成了//做重的东西
我能为这种行为做点什么吗?如果设置了标志,我想跳转函数执行 默认情况下,浏览器中的JavaScript执行不是并发的。这意味着,通常只能有一段当前正在执行的代码
您必须使用以使代码同时运行。问题是,默认情况下,javascript在浏览器上的单个线程中运行,因此您的代码在开始处理下一个调用之前就已完全执行,导致调用函数时,
is\u computing
始终为false。您可以使用的一种解决方法(不是世界上最干净的解决方案)是将单一的“重东西”函数划分为若干较小的函数,并让它们通过setTimeout(nextFunc,1)
相互调用。让他们以这种方式互相调用,可以让浏览器有时间做它需要做的事情,如果这是它正在做的,还可以再次调用您的函数。这一次,因为您的函数是在已经执行的函数的“中间”调用的,正在计算
仍然是真的,并且调用将像您期望的那样在开始时返回。注意:此解决方案可能不如的更可取,但它更简单
function sleep(millis) {
var date = new Date()
var curDate = null
do { curDate = new Date() }
while(curDate-date < millis)
}
function reallyLong() {
if(!reallyLong.flag) {
reallyLong.flag = true
} else {
console.log("Not executing")
return
}
sleep(250)
setTimeout(reallyLong2, 1)
function reallyLong2() {
sleep(250)
setTimeout(reallyLong3, 1)
}
function reallyLong3() {
sleep(250)
setTimeout(reallyLong4, 1)
}
function reallyLong4() {
sleep(250)
console.log("executed")
reallyLong.flag = false
}
}
功能睡眠(毫秒){
变量日期=新日期()
var curDate=null
do{curDate=new Date()}
while(当前日期<毫秒)
}
函数reallyllong(){
如果(!reallyllong.flag){
reallyLong.flag=true
}否则{
console.log(“未执行”)
返回
}
睡眠(250)
setTimeout(reallyLong2,1)
函数reallyLong2(){
睡眠(250)
setTimeout(reallyLong3,1)
}
函数reallyLong3(){
睡眠(250)
setTimeout(reallyLong4,1)
}
函数reallyLong4(){
睡眠(250)
console.log(“已执行”)
reallyllong.flag=false
}
}
如果您在主函数中定义了所有连续函数,那么它们也可以简单方便地访问相同的数据
现在唯一需要注意的是,如果您的函数正在返回某个值,则需要重写它以返回(您自己的设计或使用类似库的设计),或者接受回调作为参数,“链”中的最后一个函数将以返回值作为参数调用
请注意,上面的sleep函数是一个黑客程序,非常糟糕,非常糟糕,永远不应该使用。您的问题还不清楚。你的函数究竟是如何被调用的“~1次/秒”?我很抱歉。我改了密码。它由移动GPS事件调用。您是否询问如何异步调用您的函数?您是否试图避免浏览器UI因繁重的计算而挂起和冻结?非常感谢!我会考虑这个解决方案;)