原帖子发表在 http://community.csdn.net/Expert/TopicView.asp?id=4069144
有csdn的朋友把http://community.csdn.net/Expert/TopicView.asp?id=3191873 给翻了出来,这样在javascript中模拟多线程又有了更漂亮的做法了:
有的时候command模式也许不是最好的办法,比如我之前写的例子。写那个例子纯粹只是为了演示command确实可以用在javascript中,并不表示我们任何时候都应该优先考虑这样做。 至于command模式本身,我仍认为它是最简洁优美的模式之一,在我们用各种语言解决问题的时候都可以考虑使用它,而不止于j2se。 套一句名言:如果你的工具箱里面只有榔头这一样工具,那么每个问题在你的眼里看起来都象钉子 。
有csdn的朋友把http://community.csdn.net/Expert/TopicView.asp?id=3191873 给翻了出来,这样在javascript中模拟多线程又有了更漂亮的做法了:
1
<html><head><title>emu -- 用fason的参数化定时器模拟多线程</title></head><body>
2
<SCRIPT LANGUAGE="JavaScript">
3
<!--
4![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
5
var _st = window.setTimeout;
6
window.setTimeout = function(fRef, mDelay) {
7
if(typeof fRef == 'function'){
8
var argu = Array.prototype.slice.call(arguments,2);
9
var f = (function(){ fRef.apply(null, argu); });
10
return _st(f, mDelay);
11
}
12
return _st(fRef,mDelay);
13
}
14![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
15
var _int = window.setInterval;
16
window.setInterval = function(fRef, mDelay) {
17
if(typeof fRef == 'function'){
18
var argu = Array.prototype.slice.call(arguments,2);
19
var f = (function(){ fRef.apply(null, argu); });
20
return _int(f, mDelay);
21
}
22
return _st(fRef,mDelay);
23
}
24![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
25![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
26
function startNewTask(){
27
var target = document.getElementById("sampleResult").cloneNode(true);
28
with (target){
29
id="";style.display="block";style.color=(Math.floor(Math.random()* (1<<23)).toString(16)+"00000").substring(0,6);
30
}
31
document.body.insertBefore(target,document.body.lastChild);
32
var parameter = {target:target,n:0,result:0}
33
parameter.timer = setInterval(count,1,parameter);
34
}
35![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
36
function count(parameter){
37
with (parameter){
38
if (!target.stop){
39
for(var i=0;i<speed;i++)
40
if (n<MAX) result += ++n;
41
target.innerHTML = result;
42
}
43
if (n>=MAX){
44
clearInterval(timer);
45
setTimeout(function(elm){document.body.removeChild(elm)},2000,target);
46
}
47
}
48
}
49![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
50
var speed = 1111;
51
var MAX=100000;
52
//-->
53
</SCRIPT>
54
<button onclick="startNewTask()">开始新线程</button>
55![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
56
<BR><BR>
57
<div id=sampleResult onmouseover="this.stop=true" onmouseout="this.stop=false" style="display:none;cursor:hand">0</div>
58
</body>
59
</html>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
2
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
4
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
5
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
6
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
9
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
11
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
13
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
14
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
15
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
16
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
17
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
19
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
21
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
22
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
23
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
25
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
26
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
27
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
28
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
29
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
31
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
32
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
34
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
35
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
36
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
37
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
38
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
39
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
40
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
41
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
42
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
43
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
44
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
46
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
47
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
49
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
51
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
52
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
53
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
54
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
55
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
56
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
57
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
58
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
59
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
有的时候command模式也许不是最好的办法,比如我之前写的例子。写那个例子纯粹只是为了演示command确实可以用在javascript中,并不表示我们任何时候都应该优先考虑这样做。 至于command模式本身,我仍认为它是最简洁优美的模式之一,在我们用各种语言解决问题的时候都可以考虑使用它,而不止于j2se。 套一句名言:如果你的工具箱里面只有榔头这一样工具,那么每个问题在你的眼里看起来都象钉子 。