在javascript中真正的线程阻塞

时间:2016-05-19 21:44:48

标签: javascript multithreading alert blocking

背景

以下代码演示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') }
然而,我必须介绍丑陋的浏览器对话框。无论如何要避免这种情况?

1 个答案:

答案 0 :(得分:1)

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

  • 要进行调试,请使用Chrome开发工具设置断点。更容易。

  • 如果您想等待特定内容,Promise,callbacks和asyncqueue之类的方法相对容易使用且更灵活。

  • 如果您希望在函数中间等待语法简单,请尝试使用babel并使用async / await语法对代码进行预编译,与你在这里有类似的方式(虽然你需要等待特定的东西)。

请注意,这些都不是&#34;真正的线程阻塞&#34;。 JS中只有一个主题(除非您使用的是Workers或类似的);您可以使用while(true) {}之类的东西阻止它,但它会锁定浏览器窗口中的所有内容,包括用户交互。你实际上并不想要那个。