如何仅在web浏览器中运行javascript函数而不处理该函数

如何仅在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浏览器在完成之前处于空闲状态。

我的一个javascript函数正在处理数以百万计的数据,在硬件事件中每秒调用一次。然后,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因繁重的计算而挂起和冻结?非常感谢!我会考虑这个解决方案;)