论坛首页 Web前端技术论坛

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

浏览 18723 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-09  
借宝地问个问题,浏览器中如何实现“阻塞”,也就是说类似于java里sleep(1500)的效果。除了用不可控的xhr发出同步请求,或者短时间内的while(true)循环之外,还有其他办法吗?只要求sleep一秒左右即可……
0 请登录后投票
   发表时间:2007-11-09  
myy 写道
可以考虑用 window.open() 开新窗口实现,这个在IE下肯定是多线程的


You r wrong. They always in one script thread.

0 请登录后投票
   发表时间:2007-11-09  
fyting 写道
借宝地问个问题,浏览器中如何实现“阻塞”,也就是说类似于java里sleep(1500)的效果。除了用不可控的xhr发出同步请求,或者短时间内的while(true)循环之外,还有其他办法吗?只要求sleep一秒左右即可……


search the old posts, we have discussed it before.
0 请登录后投票
   发表时间:2007-11-09  
fins 写道
niuyuewanzi 写道
setTimeout(A,10);   
setTimeout(B,10010);   


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

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


"因为A肯定会全部执行完毕后才会执行B"
此话错误


Generally speaking, he is right u r wrong.
0 请登录后投票
   发表时间:2007-11-09  
There is no direct way to meet the Yulimin's requirements. If you want to control the execution process of a heavy task, I suggest u to separate a heavy task into many small tasks, when one task finish, u just use setTimeout to delay the next task and yield so that other timer can take over the control.

Of coz, it's complex tech, though there are some frameworks provide you the API like Executor and Queue class in other language.

Normally, if u just want to do some heavy computing, u can delegate such task to the server and use XHR to get the result.
0 请登录后投票
   发表时间:2007-11-09  
hax 写道
fins 写道
niuyuewanzi 写道
setTimeout(A,10);   
setTimeout(B,10010);   


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

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


"因为A肯定会全部执行完毕后才会执行B"
此话错误


Generally speaking, he is right u r wrong.


setTimeout(A,10);
setTimeout(B,10010);

改为
setTimeout(B,10010);
setTimeout(A,10);
呢??

其实我知道 setTimeout并不能真正的达到我们预期的多线程
但是 多少还是有点用的, 尤其是 A 和 B都不是那种会疯狂占用cpu的操作的时候
0 请登录后投票
   发表时间:2007-11-09  
hax 写道
myy 写道
可以考虑用 window.open() 开新窗口实现,这个在IE下肯定是多线程的


You r wrong. They always in one script thread.



这个我没明白
为什么新开个窗口后, 新窗口内执行的 js 和 原窗口是一个线程????

比如 原窗口内循环执行一个函数.
中途开了一个新窗口 新窗口内也是调用一个函数
难道那个窗口的函数要执行完了
原窗口的才会继续执行下去????

如果open的窗口 和原窗口是一个 script thread
那么 通过 <a href=... target='_blank' >....
打开的呢?? 也是???
0 请登录后投票
   发表时间:2007-11-09  
to Hax
下面一段代码,确实是先执行的B, 而不是A执行完之后再执行的B啊
<html>
<head>
<script type="text/javascript" >
function $(id){
	return document.getElementById(id);
}

function init(){
	setTimeout(A,5000);
	setTimeout(B,10)
}
function A(){
	$('s1').innerHTML='aaaa';
}
function B(){
	$('s2').innerHTML='bbbb';
}
</script>
</head>

<body onload="init();">
	<div id='s1'></div>
	<div id='s2'></div>
</body>
</html>
0 请登录后投票
   发表时间:2007-11-10  
to hax
我明白你的意思了
其实你是指, 理论上我说的对
但是实际情况中 我例子中的A方法会一直占有CPU ,使得方法B根本得不到运行的机会,对吧?
0 请登录后投票
   发表时间:2007-11-10  
JavaScript 虚拟机在一个浏览器中有多个实例吗?如果没有就无法实现多进程了。何况即便可以多进程,JavaScript也没有提供权限来取消进程,如果简单的抛弃进程,那么是否会造成内存泄漏呢?

一般耗时的function,大多是罗列或者递归操作。如果是两种操作的话,可以用一些技巧模拟可取消的进程。一个方法是把function里面的状态取出来放在外面,然后套一个很短的(1ms)interval来反复执行。当一定条件满足的时候,比如完成或者超时,那clearInterval就可以了。
0 请登录后投票
论坛首页 Web前端技术版

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