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