您的位置:首页 > Web前端 > JavaScript

关于JavaScript代码的运行时暂停(:中断:阻塞) 的一些想法

2009-06-27 23:38 666 查看
注:本文代码均来自互联网,稍做修改,若未特别说明,原始出处已无从考证。

不知道园子里面做WEB前端开发的多不多,想必关于JavaScript的sleep()函数如何实现的讨论已经成了很古老的话题了。我在通过搜索引擎查找这方面的资料的时候,最早能找到05年的帖子。而在这些天的,研究前人们的各种想法,发现JS的阻塞机制如果由做应用的程序员来实现的话,应该不是一件划算的事情。这片文章也只是对前人的一些观点的总结,并且加以探讨,以供以后查阅方便。

众所周知,现在JS的解释环境都是单线程的,所以,如果要实现阻塞的话,可以调用alert(),prompt(),confirm()等等函数(微软另外提供了showModalDialog()),这类函数的作用就是阻塞包含该函数的代码段,等待操作返回后,继续执行后继代码,类似于断点的效果。本人在调试JS函数的时候,就经常用到alert()函数打印运行信息,不知道这样的习惯好不好。

使用这些函数可以实现基本的阻塞效果。但是如果要追求更佳的用户体验,这类不具有用户友好的提示框无疑起到了反作用。所以更常见的,也是网上给出最多的模拟实现阻塞的办法,就是构造回调函数。

1function delegate(func)
2<html><head><title>用command模式模拟多线程</title></head><body>
2</SCRIPT>
57<button onclick="startNewTask()">开始新线程</button>
58<BR><BR>
59<div id=sampleResult onmouseover="this.stop=true" onmouseout="this.stop=false" style="display:none;cursor:hand">0</div>
60</body>
61</html>

在这段代码里面,它把要执行的逻辑看作一个命令, 每个1毫秒判断命令链里面的命令是否需要被执行(信号量),如果需要(信号量满足),则将此命令移出命令链,并且执行该命令。

事实上该方式仍然不能解决单个函数阻塞的问题,因为在它的实现里,一个命令里面是不能够被中断的 。但是这样的方法提供了一个很好的思路,因为它使用了线程的概念。如果我们再封装一层,应该就是操作系统中断的概念了。在上述代码的实现里,最小单位是一个命令,也就是一段函数。如果把最小单位再细化,便成一行语句。那么完全可以实现逐句单步执行了。在我的想法中,如果在应用程序中实现这样需要有一点限制,那就是代码格式必须有要求。

先写这么多,关键的部分还没有整理出来。以后思路理顺了补上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: