精华帖 (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 不成立。 各位有没有做过类似的需求,如何解决的呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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" 此话错误 |
|
返回顶楼 | |