javascript - JavaScript 中真正的线程阻塞

标签 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正在处理调度问题并建议代码重组。我想保留这个问题,因为我特别寻求有关使用 promise 等的建议。

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

function pause(){ alert('paused') }

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

最佳答案

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

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

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

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

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

关于javascript - JavaScript 中真正的线程阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37334555/

相关文章:

javascript - 跟踪页面访问作为别名

javascript - 在 Angular Directive(指令)中将事件绑定(bind)到 $(document)

javascript - 使用 SVG,将鼠标悬停在 X、Y 或 Z 上以使 X 和 Z 旋转

ios - 如何在不阻塞主线程的情况下添加 SCNNodes?

python - RQ 超时不会终止多线程作业

swift - 在 Alertview 中快速创建和自定义 UITextfield

javascript - alert() 不适用于文档方法

Javascript/MS 动态 CRM 2016 : Changing value of option set field using confirm box

Django + 执行异步进程?

Javascript Alert 干扰 Ajax