考虑这个JavaScript代码:
<script type="text/javascript">
function loop(Message){
document.getElementById('output').innerHTML =
document.getElementById('output').innerHTML + Message + '</br>';
}
window.setInterval("loop('Message1')", 1000); //Prints "Message1" every 1 Seconds
window.setInterval("loop('Message2')", 3000); //Prints "Message2" every 3 Seconds
</script>
<body>
<div id="output"></div>
</body>
Output:
Message1
Message1
Message2
Message1
Message1
Message1
Message2
...
Run Code Online (Sandbox Code Playgroud)
现在考虑这个PHP代码:
<?php
while(true){ // Print "Message1" every 1 Second
echo 'Message 1 </br>';
sleep(1);
}
while(true){ //This Code will never be executed,
echo 'Message 2 </br>'; //because the First Loop Blocks the Process!!!!!
sleep(3);
}
?>
Output:
Message1
Message1
Message1
Message1
Message1
Message1
...
Run Code Online (Sandbox Code Playgroud)
为什么第一个JavaScript循环不像PHP中的第一个while-Loop那样停止整个过程?
我知道Javascript是SingleThreaded,所以我想,JavaScript不能只是启动一个新线程来处理第二个循环.所以我想知道JavaScript如何阻止这里?
有人可以向我解释一下吗?
因为setInterval特别没有 sleep.
setInterval更像是一个调度程序.它标志着应该执行某些操作的时间,并让主线程完全忘记它,直到该时间到来.
sleep 另一方面,它基本上是一个无操作循环,它允许在循环时执行任何其他操作.
这很重要,因为PHP和Javascript的用例完全不同.PHP脚本具有开始和结束,并以线性方式执行.Javascript用于交互性,这意味着它需要以非线性方式响应各种事物(鼠标点击,键盘输入,定时器,AJAX回调).如果主线程被阻塞等待计时器,则不会发生任何事情,并且界面将显示为冻结.
这是jQuery的John Resig关于Javascript计时器的好文章:http://ejohn.org/blog/how-javascript-timers-work/
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |