2012-11-09 84 views
0

我目前有一个表正在由一个MySQL表填充,反过来我想从这些单元中获取数据并使用它们来创建一个模拟的实时更新,但是由于有多行im在javascript函数中使用for循环,我相信这会导致其他函数不能运行,我无法找出它的方法。运行多个函数javascript

JavaScript代码:

var seconds = 5; 
var divid = "status"; 
var url = "boo.php"; 
var timeout; 

function refreshdiv(){ 

// The XMLHttpRequest object 

var xmlHttp; 
try{ 
xmlHttp=new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari 
} 
catch (e){ 
try{ 
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer 
} 
catch (e){ 
try{ 
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 
catch (e){ 
alert("Your browser does not support AJAX."); 
return false; 
} 
} 
} 

// Timestamp for preventing IE caching the GET request 

fetch_unix_timestamp = function() 
{ 
return parseInt(new Date().getTime().toString().substring(0, 10)) 
} 

var timestamp = fetch_unix_timestamp(); 
var nocacheurl = url+"?t="+timestamp; 

// The code... 

xmlHttp.onreadystatechange=function(){ 
if(xmlHttp.readyState==4){ 
document.getElementById(divid).innerHTML=xmlHttp.responseText; 
setTimeout('refreshdiv()',seconds*1000); 
} 
} 
xmlHttp.open("GET",nocacheurl,true); 
xmlHttp.send(null); 
} 

// Start the refreshing process 

var seconds; 
window.onload = function startrefresh(){ 
setTimeout('refreshdiv()',seconds*1000); 
} 

function runningtime(int) { 
if(int == 0) { //if there is data 
console.log("int=0 so no data is present, int: " + int); 

} else if(int == 1){ 
var isRunning = new Array(); 
isRunning[0] = " "; 
for (var i=0; i < 3; i++) { 
var bool = 'running' + i; 
console.log("Running = " + bool); 
running = document.getElementById(bool).innerHTML.substring(10,11); 

console.log("running: " + running); 

if(isRunning[i] == "1") { 

var time = 'Time' + i; 

a= document.getElementById(time).innerHTML; 
console.log("a= " + a); 

    hour=a.substring(0,2); 
    min= a.substring(3,5); 
    sec= a.substring(6,8); 

    sec==sec++; 

if (min<=9) { min="0"+min; } 
if (sec<=9) { sec="0"+sec; } 

time = (hour + ":" + min + ":" + sec + " "); 

if (document.getElementById) { document.getElementById(time).innerHTML = time; } 
else if (document.layers) { 
document.layers.theTime.document.write(time); 
document.layers.theTime.document.close(); } 

} else { 
//Do nothing 
return; 
} 
} 
timeout = setTimeout("runningtime(1)", 1000); 
} 
} 

function experiencehour(exp) { 
if(exp == 0) { //if there is dexphourtexphour 
console.log("exp=0 so no data is present, exp: " + exp); 

} else if(exp == 1){ 

var isRunning = new Array(); 
isRunning[0] = " "; 
for (var i=0; i < 3; i++) { 
var bool = 'running' + i; 
console.log("Running = " + bool); 
running = document.getElementById(bool).innerHTML.substring(10,11); //checks if bot running 

console.log("running: " + running); 

if(isRunning[i] == "1") { 

var exph = 'Exph' + i; 
var expg = 'Exp' + i; 

exphour = document.getElementById(exph).innerHTML; //exphour 
currexp = document.getElementById(exp).innerHTML; //current gained exp 
exphour =parseInt(exphour); 
currexp =parseInt(currexp); 

console.log("currexp= " + currexp); 
console.log("exphour= " + exphour); 

expmin = exphour/60; 
console.log("expmin= " + expmin); 
expsec = Math.round(expmin/60); 
console.log("expsec= " + expsec); 

newtotalexp = currexp + expsec; 
console.log("newtotalexp= " + newtotalexp); 

if (document.getElementById) { document.getElementById(exp).innerHTML = newtotalexp; } //writing new exp 
else if (document.lexphouryers) { 
document.lexphouryers.theTime.document.write(time); 
document.lexphouryers.theTime.document.close(); } 

} else { 
//Do nothing 
return; 
} 
} 
timeout = setTimeout("experiencehour(1)", 1000); 
} 
} 

function variable1hour(var1) { 
if(var1 == 0) { //if there is dvar1hourtvar1hour 
console.log("var1=0 so no data is present, var1: " + var1); 

} else if(var1 == 1){ 

var isRunning = new Array(); 
isRunning[0] = " "; 
for (var i=0; i < 3; i++) { 
var bool = 'running' + i; 
console.log("Running = " + bool); 
isRunning[i] = document.getElementById(bool).innerHTML.substring(10,11); //checks if bot running 
console.log("isRunning = " + isRunning[i]); 



if(isRunning[i] == "1") { 

var varh = 'Varh' + i; 
var varg = 'Var' + i; 

console.log("Varh = " + varh); 
console.log("Var = " + varg); 

var1hour = document.getElementById(varh).innerHTML; //var1hour 
currvar1 = document.getElementById(varg).innerHTML; //current gained var1 
var1hour =parseInt(var1hour); 
currvar1 =parseInt(currvar1); 

console.log("currvar1= " + currvar1); 
console.log("var1hour= " + var1hour); 

var1min = var1hour/60; 
console.log("var1min= " + var1min); 
var1sec = Math.round(var1min/60); 
console.log("var1sec= " + var1sec); 

newtotalvar = currvar1 + var1sec; 
console.log("newtotalvar= " + newtotalvar); 

if (document.getElementById) { document.getElementById(varg).innerHTML = newtotalvar; } //writing new var1 
else if (document.lvar1houryers) { 
document.lvar1houryers.theTime.document.write(time); 
document.lvar1houryers.theTime.document.close(); 
} 

} else { 
//Do nothing 
return; 
} 
} 
timeout = setTimeout("variable1hour(1)", 1000); 
} 
} 

function stopScript() { 
console.log("Stopping script"); 
clearTimeout(timeout); 
} 

function startScript(i) { 
variable1hour(i); 
experiencehour(i); 
runningtime(i); 
} 

如何,我可以解决这个问题,所以我可以同时运行的所有3种功能的任何想法。

我已经检查控制台,并没有得到任何错误,将阻止他们运行。

回答

0

你不能同时在JS中。但你可以模拟在JS中同时有点。

看看下划线的defer方法。

http://underscorejs.org/#defer

它会像这样工作:

  • 搭袢身体包起来在功能
  • 每次迭代通过for循环,使用作出的函数调用推迟

基本上就是这样。这样做会允许其他函数“中断”任何给定的进程(函数),从而“共享”执行线程。

标准JS实现无延迟。我试图模拟延期的更接近。这里关键的一点是,虽然这些调用仍然按照它们排队的顺序执行,但在它们中的任何一个完成之前,所有调用都会“开始”。在AJAX异步请求的情况下,异步响应应该能够在任何两次循环迭代之间注入自身。您也可以通过轻微的延迟

http://jsfiddle.net/t2z9A/

for(var i = 0; i != 5; ++i) 
{ 
    (function(index) 
    { 
     document.getElementById('id' + index).innerHTML = 'started...'; 

     setTimeout(function() 
     { 
      // kill some time 
      var str = ''; 
      for(var j = 0; j != 10000000; ++j) 
       str = str + ' '; 

      document.getElementById('id' + index).innerHTML = 'Function: 1. Index: ' + index + ' - ' + new Date().getTime(); 
     }, index); 
    })(i); 
} 

for(var i = 5; i != 10; ++i) 
{ 
    (function(index) 
    { 
     document.getElementById('id' + index).innerHTML = 'started...'; 

     setTimeout(function() 
     { 
      // kill some time 
      var str = ''; 
      for(var j = 0; j != 1000000; ++j) 
       str = str + ' '; 

      document.getElementById('id' + index).innerHTML = 'Function: 2. Index: ' + index+ ' - ' + new Date().getTime(); 
     }, 1); 
    })(i); 
} 
+0

小记设置数据处理:你越“推迟”,您的循环体拼接成的单位,更多的共享它会。在执行另一个函数之前,每个函数都会执行直到完成。所以,切片和骰子尽可能多,以便获得您想要的执行共享类型。 –

+0

如此理想,我想在for循环的每次迭代之后推迟,以便一次更新几乎一行,然后向下移动? – Scott

+0

是的。例如:for(var i = 0; i!= 3; ++ i){_.defer(fn,i); }'其中'fn'是主体的函数,并且它需要执行的唯一参数是'i'。并且快速浏览你的代码,它看起来就是你所需要的。试一试!我用一个标准的JS实现编辑我的代码进行比较。模拟一个“中断”是非常棘手的,但我想告诉你它是如何排队的,而不是等待整个for循环(模拟函数)完成后才能继续下一个循环。我希望这有帮助。 –