背景
以下代码演示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正在处理调度问题并建议代码重组。我想保留这个问题,因为我特别不询问有关使用承诺等的建议。
通过解释,我正在编写用于进行定时响应延迟试验的单个网页(仅我的代码)。有许多移动部件,我可以通过简单地写
来实现暂停function pause(){ alert('paused') }
然而,我必须介绍丑陋的浏览器对话框。无论如何要避免这种情况?
答案 0 :(得分:1)
答案非常简短:不要这样做。如果您需要控制异步进程的顺序,有多种更好的方法。
要进行调试,请使用Chrome开发工具设置断点。更容易。
如果您想等待特定内容,Promise,callbacks和async
或queue
之类的方法相对容易使用且更灵活。
如果您希望在函数中间等待语法简单,请尝试使用babel
并使用async
/ await
语法对代码进行预编译,与你在这里有类似的方式(虽然你需要等待特定的东西)。
请注意,这些都不是&#34;真正的线程阻塞&#34;。 JS中只有一个主题(除非您使用的是Workers或类似的);您可以使用while(true) {}
之类的东西阻止它,但它会锁定浏览器窗口中的所有内容,包括用户交互。你实际上并不想要那个。