作者:emu(黄希彤)今天和徐鹏程msn的时候聊起javascript不支持多线程。以前也看过有高手在wsh上可以创建thread对象,但是毕竟不是常规手段,我们做web应用一般没有本地访问权限的,用activex的没试过,毕竟也不是javascript方式。
以前我们解决这样的问题都是针对具体问题写一段代码来模拟多线程的,但是由于往往要对没个线程单独编码,这样的代码十分冗长。学习设计模式的时候就曾经考虑过在javascript中实用command模式来更好的模拟多线程,但是一直没有付诸实施,今天既然想起来了就试试看:
<
html
><
head
><
title
>
emu--用command模式模拟多线程
</
title
></
head
><
body
>
2

<
SCRIPT
LANGUAGE
="JavaScript"
>
3
<!--4
if(Array.prototype.shift==null)5

Array.prototype.shift=function()
{6
varrs=this[0];7
for(vari=1;i<this.length;i++)this[i-1]=this[i]8
this.length=this.length-19
returnrs;10
}11
if(Array.prototype.push==null)12

Array.prototype.push=function()
{13
for(vari=0;i<arguments.length;i++)this[this.length]=arguments[i];14
returnthis.length;15
}16

17
varcommandList=[];18
varnAction=0;//控制每次运行多少个动作19

varfunctionConstructor=function()
{}.constructor;20

functionexecuteCommands()
{21
for(vari=0;i<nAction;i++)22

if(commandList.length>0)
{23
varcommand=commandList.shift();24
if(command.constructor==functionConstructor)25
if(command.scheduleTime==null||newDate()-command.scheduleTime>0)26
command();27
else28
commandList.push(command);29
}30
}31

32

functionstartNewTask()
{33
varresultTemp=document.getElementById("sampleResult").cloneNode(true);34

with(resultTemp)
{35
id="";style.display="block";style.color=(Math.floor(Math.random()*(1<<23)).toString(16)+"00000").substring(0,6);36
}37
document.body.insertBefore(resultTemp,document.body.lastChild);38

commandList.push(function()
{simThread(resultTemp,1);});39
nAction++;40
}41

42

functionsimThread(temp,n)
{43
if(temp.stop)n--;44
elsetemp.innerHTML=temp.innerHTML-(-n);45
if(n<1000)46

commandList.push(function()
{simThread(temp,++n)});47

else
{48

varcommand=function()
{document.body.removeChild(temp);;nAction--;};49
command.scheduleTime=newDate()-(-2000);50
commandList.push(command);51
}52
}53

54

window.onload=function()
{setInterval("executeCommands()",1);}55
//-->56
</
SCRIPT
>
57
<
button
onclick
="startNewTask()"
>
开始新线程
</
button
>
58

59
<
BR
><
BR
>
60
<
div
id
=sampleResult
onmouseover
="this.stop=true"
onmouseout
="this.stop=false"
style
="display:none;cursor:hand"
>
0
</
div
>
61
</
body
>
62
</
html
>
注意第26行。javascript里面函数也是对象,所以就没有必要把函数调用包装到do或者execute方法里面了,直接用()就可以让函数对象运行起来:
command();
shift和push函数是javascript中array对象的函数,可是IE5居然没有定义,最前面两个函数是为IE5准备的。
在IE和FireFox下面通过作者:emu(黄希彤)。
作者与徐鹏程交流时谈及JavaScript不支持多线程,以往解决此类问题需针对具体问题写代码模拟,代码冗长。作者考虑用Command模式在JavaScript中更好地模拟多线程并进行尝试,还提到IE5未定义array对象的shift和push函数,代码在IE和FireFox下通过。
16万+

被折叠的 条评论
为什么被折叠?



