论坛首页 Web前端技术论坛

[转]用javascript 的command模拟多线程

浏览 665 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2008-05-24  
以前也看过有高手在wsh上可以创建thread对象,但是毕竟不是常规手段,我们做web应用一般没有本地访问权限的,用activex的没试过,毕竟也不是javascript方式。  
  以前我们解决这样的问题都是针对具体问题写一段代码来模拟多线程的,但是由于往往要对没个线程单独编码,这样的代码十分冗长(http://www.blogjava.net/Files/emu/counting.zip)。学习设计模式的时候就曾经考虑过在javascript中实用command模式来更好的模拟多线程,但是一直没有付诸实施,今天既然想起来了就试试看:  
   
  <html>  
  <head>  
  <title>emu   --   用command模式模拟多线程</title>  
  </head>  
  <body>  
  <SCRIPT   LANGUAGE="JavaScript">  
  <!--  
  var   commandList   =   [];  
  function   executeCommands(){  
  if   (commandList.length>0){  
  commandList.shift()();  
   
  }  
  }  
   
  function   startNewTask(){  
  var   resultTemp   =   document.createElement("span");  
  document.body.insertBefore(resultTemp,document.body.lastChild);  
  document.body.insertBefore(document.createElement("br"),document.body.lastChild);  
  resultTemp.innerText   =   0;  
          commandList.push(function(){simThread(resultTemp,0);});  
  }  
   
  function     simThread(temp,n){  
  temp.innerText   =   temp.innerText-(-n);  
  if   (n<1000)  
  commandList.push(function(){simThread(temp,++n);});  
  else{  
  document.body.removeChild(temp.nextSibling);  
  document.body.removeChild(temp);  
  }  
  }  
   
  window.onload   =   function(){setInterval("executeCommands()",1);}  
   
  //-->  
  </SCRIPT>  
  <button   onclick="startNewTask()">start</button>  
   
  <BR><BR>  
  </body>  
  </html>  
   
  注意第11行。javascript里面函数也是对象,所以就没有必要把函数调用包装到do或者execute方法里面了,直接用()就可以让函数对象运行起来:  
  commandList.shift()();  
   
   
  shift函数是javascript中array对象的函数,可是IE5居然没有定义,不过我曾经实现过IE5上面没实现的全部array函数,可以用这个脚本来增强IE5:   http://www.blogjava.net/Files/emu/IE5ArrayFunctions.zip  
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics