|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-11-09 关键字: 方法 执行 超时 settimeout setinterval
我的一个想法是这样的,如下代码:
<!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 不成立。 各位有没有做过类似的需求,如何解决的呢? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-11-09
引用 但是 setTimeout / setInterval 方法是在它所在的方法执行完之后才开始计时的 你可以把 setTimeout / setInterval 方法后的 代码 再放到一个 setTimeout / setInterval 里啊 被监听方法 A 超时时间 10000毫秒 超时监听器 LQ 超时后 执行方法 B 那么函数可以这样写 LQ ( A ,10000 ,B) LQ里面: setTimeout(A,20); setTimeout(B,10020); 大概就是这么个意思 |
|
| 返回顶楼 | |
|
时间:2007-11-09
不确定所谓的超时的具体含义是什么,如果只是为了让后面的METHOD2在前面的METHOD1运行一段时间后运行的话,
setTimeout(method2(),duration);
method1();
不管method1是否真的执行了,或有错了,method2会被执行ANYWAY...
|
|
| 返回顶楼 | |
|
时间: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);
}
我这么说 不知道楼上的明白没 |
|
| 返回顶楼 | |
|
时间:2007-11-09
setTimeout(A,10); setTimeout(B,10010); 我觉得这样起不到监听的效果,因为A肯定会全部执行完毕后才会执行B. 如果说用setInteval(A,duration)应该是可以的. 但是如果是因为SCRIPT占资源超时,我觉得可能没有合适的办法来计算超时多久后ABORT... 初学JAVASCRIPT,不深,有错请指点... |
|
| 返回顶楼 | |
|
时间:2007-11-09
写成callback
一般XHR都有,可参考 callback :{
sccuess : fn,
failure : fn
}
|
|
| 返回顶楼 | |
|
时间:2007-11-09
首先js是单线程的,lz的想法就不对,那是多线程,现在基本除了XHR的callback可以另开一个线程以外,还无法实现多线程,其次timeout是在本次js代码运行完开始计时timeout的,所以在一个耗时的函数之外timeout或者interval一个函数运行本身就是荒谬的,ie下面alert,js函数执行也会阻塞interval执行,应该其他浏览器也是这么实现,我没测试,如果interval可以实现多线程,那至少ie上面也不行
|
|
| 返回顶楼 | |
|
时间:2007-11-09
基本认同 afcn0 的看法。
在 IE 中的单个页面中,js总是单线程的(我甚至认为XHR的callback也不是另开线程的,可以试验下,在send()之后立即进入死循环,callback不会被触发),楼主的要求是不可能做到的。 可以考虑用 window.open() 开新窗口实现,这个在IE下肯定是多线程的,但是肯定复杂且不优雅。 |
|
| 返回顶楼 | |
|
时间:2007-11-09
嘿嘿,你这个命题是错误的吧!
超时和不超时A方法的执行没有区别啊!!! 应该是超时是A方法,不超时是C方法才好吧!!! |
|
| 返回顶楼 | |
|
时间:2007-11-09
niuyuewanzi 写道 setTimeout(A,10); setTimeout(B,10010); 我觉得这样起不到监听的效果,因为A肯定会全部执行完毕后才会执行B. 如果说用setInteval(A,duration)应该是可以的. 但是如果是因为SCRIPT占资源超时,我觉得可能没有合适的办法来计算超时多久后ABORT... 初学JAVASCRIPT,不深,有错请指点... "因为A肯定会全部执行完毕后才会执行B" 此话错误 |
|
| 返回顶楼 | |










