`

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

    博客分类:
  • RIA
阅读更多
我的一个想法是这样的,如下代码:
<!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 不成立。
各位有没有做过类似的需求,如何解决的呢?
分享到:
评论
17 楼 fins 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>
16 楼 fins 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' >....
打开的呢?? 也是???
15 楼 fins 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的操作的时候
14 楼 hax 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.
13 楼 hax 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.
12 楼 hax 2007-11-09  
fyting 写道
借宝地问个问题,浏览器中如何实现“阻塞”,也就是说类似于java里sleep(1500)的效果。除了用不可控的xhr发出同步请求,或者短时间内的while(true)循环之外,还有其他办法吗?只要求sleep一秒左右即可……


search the old posts, we have discussed it before.
11 楼 hax 2007-11-09  
myy 写道
可以考虑用 window.open() 开新窗口实现,这个在IE下肯定是多线程的


You r wrong. They always in one script thread.

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


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

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


"因为A肯定会全部执行完毕后才会执行B"
此话错误
8 楼 radar 2007-11-09  
嘿嘿,你这个命题是错误的吧!

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

应该是超时是A方法,不超时是C方法才好吧!!!
7 楼 myy 2007-11-09  
基本认同 afcn0 的看法。

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

可以考虑用 window.open() 开新窗口实现,这个在IE下肯定是多线程的,但是肯定复杂且不优雅。
6 楼 afcn0 2007-11-09  
首先js是单线程的,lz的想法就不对,那是多线程,现在基本除了XHR的callback可以另开一个线程以外,还无法实现多线程,其次timeout是在本次js代码运行完开始计时timeout的,所以在一个耗时的函数之外timeout或者interval一个函数运行本身就是荒谬的,ie下面alert,js函数执行也会阻塞interval执行,应该其他浏览器也是这么实现,我没测试,如果interval可以实现多线程,那至少ie上面也不行
5 楼 sp42 2007-11-09  
写成callback
一般XHR都有,可参考
callback :{
  sccuess : fn,
  failure : fn
}
4 楼 niuyuewanzi 2007-11-09  
setTimeout(A,10);   
setTimeout(B,10010);   


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

初学JAVASCRIPT,不深,有错请指点...
3 楼 fins 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);
}


我这么说 不知道楼上的明白没
2 楼 niuyuewanzi 2007-11-09  
不确定所谓的超时的具体含义是什么,如果只是为了让后面的METHOD2在前面的METHOD1运行一段时间后运行的话,

setTimeout(method2(),duration);
method1();

不管method1是否真的执行了,或有错了,method2会被执行ANYWAY...
1 楼 fins 2007-11-09  
引用

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


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


被监听方法 A

超时时间 10000毫秒

超时监听器 LQ

超时后 执行方法  B


那么函数可以这样写

LQ ( A ,10000 ,B)

LQ里面:

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



大概就是这么个意思

相关推荐

    为jquery的ajax请求添加超时timeout时间的操作方法

    在上述代码中,complete回调函数会在Ajax请求完成时执行,无论成功、失败还是超时。通过检查status参数的值,我们可以判断请求是否因为超时而结束,并执行相应的处理操作。 总结以上所述,为jQuery的Ajax请求添加...

    基于JavaScript实现一定时间后去执行一个函数

    JavaScript中的`setTimeout()`函数是一个非常重要的工具,它允许开发者安排代码在特定的延迟后执行,这对于创建动态效果、异步处理、以及定时任务等场景非常有用。下面将详细讲解`setTimeout()`函数的使用方法和相关...

    JavaScript控制窗口2.pdf

    在JavaScript中,窗口对象(Window)是全局对象,提供了对浏览器窗口的各种控制,包括控制窗口的状态栏、访问窗口的历史记录以及设置超时等功能。 1. **控制窗口状态栏** 窗口状态栏通常位于浏览器窗口的底部,...

    网页中使用传统方法实现异步校验详解

    而在异步编程中,即使某个任务需要时间(如网络请求),程序也不会阻塞,而是继续执行其他任务,当异步任务完成时再通知程序处理结果。这使得用户体验更加流畅,尤其是在需要网络交互的场景下。 在网页中,我们通常...

    浅谈JavaScript超时调用和间歇调用

    超时调用的使用场景包括但不限于:动画和定时任务的实现,以及在一些复杂的事件处理中等待一段时间后再执行操作。例如,在一个表单验证的场景中,可以在用户停止输入一段时间后才开始验证,这可以通过setTimeout来...

    计时器实现

    在计算机编程中,计时器是一种非常重要的工具,它用于执行特定操作或在特定时间间隔后触发事件。计时器的实现方式多种多样,适用于不同的编程语言和应用场景。本篇文章将深入探讨计时器的基本原理、常见实现方法以及...

    解决js ajax同步请求造成浏览器假死的问题

    同步请求会在请求完成之前阻塞浏览器的主线程,而异步请求则允许浏览器在等待响应时继续执行其他任务。 同步请求造成浏览器假死的问题通常发生在执行耗时的网络请求时。在这个请求完成之前,浏览器不会渲染任何内容...

    前端项目-jquery-dotimeout.zip

    4. **轮询循环**:doTimeout支持在满足特定条件前持续执行某个函数,这在实现条件检测或者等待某个状态改变的场景下非常实用。 5. **去块优化**:与原生的setTimeout相比,doTimeout在执行延迟任务时考虑到了事件...

    封装一个Ext消息提示框,显示几秒后自动消失

    要实现自动消失的功能,我们可以使用 setTimeout 函数,该函数可以在指定的时间后执行某个函数。在本例中,我们可以使用 setTimeout 函数来关闭消息提示框。例如,我们可以在显示消息提示框时使用 setTimeout 函数,...

    Selenium 模拟浏览器动态加载页面的实现方法.pdf

    在实际应用中,可能还需要结合其他技巧,如设置User-Agent、处理验证码、模拟登录等,以适应各种复杂的网页抓取需求。记住,始终尊重网站的robots.txt文件,遵循抓取规则,以免引起不必要的麻烦。

    易语言取网页文本中的指定内容

    这个过程通常包括设置URL、请求方法、超时时间等参数,然后发送请求并接收服务器返回的响应。 在获取到HTML源代码后,接着是解析和抽取目标内容。这通常涉及对HTML的解析,易语言可能没有内置的HTML解析库,但可以...

    $.ajax()方法详解

    例如,在处理异步请求时,可以根据返回的数据类型进行不同的处理,比如获取JSON数据后在前端进行动态显示,或者更新页面的某个部分等。$.ajax()方法的灵活使用,大大简化了AJAX技术的应用,使得开发者能够更加专注于...

    前端开源库-jeefo_timeout

    在Web应用中,我们经常遇到需要等待某个操作完成,但又不能无限期等待的情况,这时就需要设定一个超时时间来确保程序的正常运行。jeefo_timeout作为jeefo框架的一个组成部分,为开发者提供了优雅地处理这种问题的...

    Asyncjsnode和浏览器异步工具

    使用 `delay` 函数可以实现延迟执行,而 `timeout` 则可以为异步操作设置超时,防止程序因为某个操作卡住。 6. **错误处理**: 在异步编程中,错误处理是关键。Async.js 提供了一个 `tryCatch` 高阶函数,可以...

    vue.js实现刷新当前页面的方法教程

    下面我们将详细介绍如何在Vue.js环境中实现刷新当前页面的方法。 **一、刷新原理** 刷新页面的基本思路是利用Vue Router的导航机制。首先创建一个空页面(例如:/user/back),当用户完成某个操作后,页面会跳转到...

    selenium中文API

    为了提高测试的灵活性,某些动作命令可以附加“并等待”后缀,如“点击并等待”,表示在执行动作之后,Selenium会等待浏览器加载新的页面,直至某个条件满足或者超时。 辅助命令主要用于检查应用程序的状态,并将...

    jquery-part2

    2. 异步请求:文档强调了AJAX请求的异步特性,意味着当Web浏览器发送AJAX请求到服务器时,它不需要等待服务器响应,而可以继续执行其他代码。这使得用户体验更加流畅,因为页面不需要重新加载即可与服务器进行交互。...

    DocumentloadingstatesasPromises

    除了简单的监听事件,我们还可以利用Promise链来实现更复杂的逻辑,比如在某个特定的加载状态之后执行特定的操作,或者在加载过程中添加超时机制。 6. **async/await** ES7引入的async/await语法可以让Promise的...

    DWR3精确推送的配制方法

    DWR (Direct Web Remoting) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的Java对象进行直接交互,实现AJAX功能。在DWR3中,"精确推送"(也称为反向推送或服务器推送)是一种技术,允许服务器主动地将...

    前端开源库-wait-for-event.zip

    这个库特别适用于那些需要在特定事件触发后才能继续执行的场景,例如异步操作、动画完成或者用户确认等。 `wait-for-event` 库的核心功能在于它允许开发者注册一个回调函数,该函数会在指定的事件被触发时得到执行...

Global site tag (gtag.js) - Google Analytics