论坛首页 Web前端技术论坛

如何在JavaScript中实现某个方法执行超时后则继续执行其它方法?

浏览 18724 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-09  
我的一个想法是这样的,如下代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>JavaScript方法执行超时测试</title>
<script>
	var executed = false; // 方法B是否执行的标志位
	var x = 0; // 方法A中用来累加计数,使方法A执行超时
	var expiredTime = 3000;
	
	// 方法A
	function methodA( )
	{
		// 第一句就执行定时器
		setTimeout("methodB()",expiredTime);// setInterval()
		// 方法A的耗时内容执行开始
		x = x + 1;
		document.counter.displayBox.value = x;
		for(i = 0;i < 80000;i++)
		{
			window.status = "i=" + i;
		}
		// 方法A的耗时内容执行结束
		
		// 当方法A的耗时内容没有超过expiredTime的时间执行完成的话,就直接开始执行方法B
		methodB();
		// 设置方法B执行完成的标志位
		executed = true;
	}

	// 方法B
	function methodB()
	{
		if(executed == true)
		{
			// 执行过了......
		}
		else
		{
			// 执行......
		}
	}
</script>
</head>

<body>
<form name="counter">
	<input type="text" name="displayBox" value="0" size="10"/>
</form>

<script>
methodA();
</script>

</body>
</html>


异想天开,想用 setTimeout 来做个 workaround ,但是 setTimeout / setInterval 方法是在它所在的方法执行完之后才开始计时的,于是,光当一声,这个 workaround 不成立。
各位有没有做过类似的需求,如何解决的呢?
   发表时间:2007-11-09  
引用

但是 setTimeout / setInterval 方法是在它所在的方法执行完之后才开始计时的


你可以把
setTimeout / setInterval  方法后的 代码
再放到一个 setTimeout / setInterval  里啊


被监听方法 A

超时时间 10000毫秒

超时监听器 LQ

超时后 执行方法  B


那么函数可以这样写

LQ ( A ,10000 ,B)

LQ里面:

setTimeout(A,20);
setTimeout(B,10020);



大概就是这么个意思
0 请登录后投票
   发表时间:2007-11-09  
不确定所谓的超时的具体含义是什么,如果只是为了让后面的METHOD2在前面的METHOD1运行一段时间后运行的话, setTimeout(method2(),duration); method1(); 不管method1是否真的执行了,或有错了,method2会被执行ANYWAY...
0 请登录后投票
   发表时间:2007-11-09  
被监听函数

function A(){
  A.stopMe=false;
  A.finish=false;
  for (var i=0;i<10000;i++){
    //...若干比较耗时的操作...
    if (A.stopMe===true){ return ; }
  }
  A.finish=true;
}

监听函数
function B(){
  A.stopMe = A.finish===false;
}


再来个监听启动者
在 A运行 10000毫秒后 去执行B
function startListen(){
  setTimeout(A,10);
  setTimeout(B,10010);
}


我这么说 不知道楼上的明白没
0 请登录后投票
   发表时间:2007-11-09  
setTimeout(A,10);   
setTimeout(B,10010);   


我觉得这样起不到监听的效果,因为A肯定会全部执行完毕后才会执行B. 如果说用setInteval(A,duration)应该是可以的. 但是如果是因为SCRIPT占资源超时,我觉得可能没有合适的办法来计算超时多久后ABORT...

初学JAVASCRIPT,不深,有错请指点...
0 请登录后投票
   发表时间:2007-11-09  
写成callback
一般XHR都有,可参考
callback :{
  sccuess : fn,
  failure : fn
}
0 请登录后投票
   发表时间:2007-11-09  
首先js是单线程的,lz的想法就不对,那是多线程,现在基本除了XHR的callback可以另开一个线程以外,还无法实现多线程,其次timeout是在本次js代码运行完开始计时timeout的,所以在一个耗时的函数之外timeout或者interval一个函数运行本身就是荒谬的,ie下面alert,js函数执行也会阻塞interval执行,应该其他浏览器也是这么实现,我没测试,如果interval可以实现多线程,那至少ie上面也不行
1 请登录后投票
   发表时间:2007-11-09  
基本认同 afcn0 的看法。

在 IE 中的单个页面中,js总是单线程的(我甚至认为XHR的callback也不是另开线程的,可以试验下,在send()之后立即进入死循环,callback不会被触发),楼主的要求是不可能做到的。

可以考虑用 window.open() 开新窗口实现,这个在IE下肯定是多线程的,但是肯定复杂且不优雅。
0 请登录后投票
   发表时间:2007-11-09  
嘿嘿,你这个命题是错误的吧!

超时和不超时A方法的执行没有区别啊!!!

应该是超时是A方法,不超时是C方法才好吧!!!
0 请登录后投票
   发表时间:2007-11-09  
niuyuewanzi 写道
setTimeout(A,10);   
setTimeout(B,10010);   


我觉得这样起不到监听的效果,因为A肯定会全部执行完毕后才会执行B. 如果说用setInteval(A,duration)应该是可以的. 但是如果是因为SCRIPT占资源超时,我觉得可能没有合适的办法来计算超时多久后ABORT...

初学JAVASCRIPT,不深,有错请指点...


"因为A肯定会全部执行完毕后才会执行B"
此话错误
0 请登录后投票
论坛首页 Web前端技术版

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