在没有不必要的计算的情况下阻止JavaScript执行一段时间

时间:2017-12-13 17:57:19

标签: javascript client-server

我希望通过在页面顶部放置一些JavaScript,以完全同步的方式阻止客户端JavaScript执行指定的毫秒数(例如 sleep )。

等待时不会发生任何事情。该页面不应继续加载。它应该没有响应。另外,如果可能的话,我想要1-10毫秒的精度,等待时间可以超过1000毫秒。

这个问题的标准“解决方案”是......提出一个不同的问题,因为这不是你通常想做的事情。你通常想要做的是await Promise.delay(1000)

所以我完全清楚这样做的问题,充分意识到这几乎在所有情况下都是一个糟糕的想法,但我仍然需要这样做。只是为了让你的灵魂放心,页面只会被无头浏览器使用,所以没有用户会在执行这个黑客时受到伤害。

问题的实际解决方案是:

while (expectedTime > Date.now()) { }

哪个效果很好。但是当我想做的只是告诉事件循环 stop 时,它会产生大量不必要计算的副作用。

我认为诀窍可能是强制页面在前几百毫秒内执行一些同步I / O然后采用上述策略,但我不确定如何实现这一点。我也可以使用服务器,如果有帮助的话。

2 个答案:

答案 0 :(得分:-1)

尝试使用async/await语法,看看这个。

async function stop_fn() {
  var a = 99999999
  var b = 11111111
  console.log('hello there')

  //This will stop the execution without CPU blocking
  await new Promise(next=> setTimeout(()=> next(), 4000))

  console.log('After 4000ms', a)

  //Another 4000ms stop
  await new Promise(next=> setTimeout(()=> next(), 4000))
  console.log('after 4000ms more, please stop it', b)

  return 'end of this'
}
stop_fn()

答案 1 :(得分:-1)

//random blocking function 
function blockCpu(ms) {
    var now = new Date().getTime();
    while(true) {     
        if (new Date().getTime() > now +ms) 
            return; 
    } 
}