背景:
下面的代码演示了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)
当我根据预定的时间间隔编排各种函数调用时,这提供了一种出色的暂停机制。
我的问题:
可以在不调用alert
的情况下完成此操作吗?
编辑 虽然类似于以下问题:What is the JavaScript version of sleep()?对这个问题的回答主要假设OP正在处理调度问题并建议代码重组。我想保留这个问题,因为我特别不寻求有关使用 promise 等的建议。
通过解释,我正在编写单个网页(仅我的代码),用于进行定时响应延迟试验。有很多移动部分,我可以通过简单地编写来实现暂停
function pause(){ alert('paused') }
但是我必须介绍一下丑陋的浏览器对话框。无论如何要避免这种情况?
最佳答案
非常简短的答案:不要这样做。如果您需要控制异步进程的顺序,有多种更好的方法。
要进行调试,请使用 Chrome 开发工具设置断点。容易多了。
如果您想等待特定的内容,Promises、回调等方法以及
async
或queue
等库相对易于使用且更灵活。如果您希望在函数中间等待的语法简单,请尝试使用
babel
预编译代码并使用async
/await
语法,其行为方式与您此处的类似(尽管您需要等待特定的内容)。
请注意,这些都不是“真正的线程阻塞”。 JS 中只有一个线程(除非你使用 Workers 或类似的);您可以使用 while(true) {}
之类的方法来阻止它,但它会锁定浏览器窗口中的所有内容,包括用户交互。你实际上并不想要这样。
关于javascript - JavaScript 中真正的线程阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37334555/