javascript 中的真正线程阻塞

True thread blocking in javascript

背景:

下面的代码演示了alert函数阻塞了setTimeout的操作:

// clock time
function now(){ return (new Date()).getTime() } 

var start = now(),
    elapsed_before_interruption

// This will interrupt the function below
setTimeout(function(){
    elapsed_before_interruption = now()-start   
    alert('Paused')
    start = now()
}, 2000)


setTimeout(function(){
  var elapsed_since_interruption = now() - start
  var elapsed = elapsed_since_interruption + elapsed_before_interruption

  // drop < 1/100s from display
  var t = Math.round(100 * elapsed / 1000)/ 100

  // Always finishes ~4 seconds after (i.e has been interrupted)
  alert( 'Elapsed time: ' + t 's' )

}, 4000)

fiddle

当我根据预先确定的时间间隔编排各种函数调用时,这提供了一个很好的暂停机制。

我的问题:

这可以不调用 alert 来完成吗?

编辑 虽然类似于以下问题:What is the JavaScript version of sleep()? 对该问题的回答主要假设 OP 正在处理调度问题并建议代码重组。我想继续问这个问题,因为我特地 不是 寻求有关处理承诺等方面的建议

通过解释,我正在编写用于进行定时响应延迟试验的单个网页(仅我的代码)。有很多移动部件,我可以通过简单地写

来实现暂停
function pause(){ alert('paused') }

但是我不得不介绍丑陋的浏览器对话框。无论如何要避免这种情况?

非常简短的回答:不要这样做。如果你需要控制异步进程的顺序,有多种更好的方法。

  • 调试时,使用Chrome开发工具设置断点。容易多了。

  • 如果您想等待特定的事情,Promises、回调和库 asyncqueue 等方法相对易于使用且更灵活。

  • 如果您希望在函数中间等待的语法简单,请尝试使用 babel 预编译代码并使用 async/await 语法,它的行为方式与您在此处的行为类似(尽管您需要等待特定的事情)。

请注意,其中 none 个是 "true thread blocking"。 JS 中只有一个线程(除非你使用的是 Workers 或类似的线程);您可以使用 while(true) {} 之类的内容来阻止它,但它会锁定您浏览器中的所有内容 window,包括用户交互。你实际上并不想要那个。