论坛首页 Web前端技术论坛

关于用XHR实现浏览器端pause()功能

浏览 3893 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-29  
关于pause功能已经有很多讨论。
看了很多资料,基本得到的结论是除了sjax,无法完整实现pause功能。
但是如果直接用应用服务器来处理这个同步XHR请求,随着pause时间越长,后台的http线程池会被消耗光。
我想了个方案(前提是servlet 3.0出来前),通过内嵌jetty,在特定的端口专门提供这种pause服务,这样就不会占用应用服务器的http线程了。
不知道可行不?大家提提建议
   发表时间:2009-01-31  
呵呵,见过不怕死的,没见过自己伸出脖子送死的。

xhr pause会让浏览器假死,而且因为JS语法的一些历史原因,这个状态短期内不要指望有很大的变化。
0 请登录后投票
   发表时间:2009-01-31  
jindw 写道
呵呵,见过不怕死的,没见过自己伸出脖子送死的。

xhr pause会让浏览器假死,而且因为JS语法的一些历史原因,这个状态短期内不要指望有很大的变化。

ls说的很有道理。
不过lz的想法很有创意,这样倒是可以解决一些问题,但是带来的新问题更大。
0 请登录后投票
   发表时间:2009-02-01  
jindw 写道
呵呵,见过不怕死的,没见过自己伸出脖子送死的。

xhr pause会让浏览器假死,而且因为JS语法的一些历史原因,这个状态短期内不要指望有很大的变化。


假死不要紧吧(其实是因为richfaces是异步调用,我想用它来做校验,等服务器校验结果返回后再决定是否提交表单,所以想用pause来延迟一段时间,直到服务器结果返回),而且同步XHR不是可以设置超时吗?
0 请登录后投票
   发表时间:2009-02-01  
假死问题很严重。随便找个用户问问看。
0 请登录后投票
   发表时间:2009-02-04  
pause没有好的方法。
用隐藏的模态对话框是一个方式,但是IE-only,而且现在模态对话框已经无法隐藏了。

用同步xhr只是能实现效果,但是如jindw所说,显然也不是好方法。


一般而言,如果有了yield,编程上就不需要pause了。如果你有什么场景觉得需要pause,可以拿出来大家探讨探讨。


最后,月影在51js上写过一篇文章描述如何通过源代码操作来实现pause(实际上就是代码生成),这个方式理论上可以延伸到实现yield(其实类似于把另一种语言转换或说编译为js啦),但是没有见到进一步深入下去。

0 请登录后投票
   发表时间:2009-02-04   最后修改:2009-02-04
hax 写道
pause没有好的方法。
用隐藏的模态对话框是一个方式,但是IE-only,而且现在模态对话框已经无法隐藏了。

用同步xhr只是能实现效果,但是如jindw所说,显然也不是好方法。


一般而言,如果有了yield,编程上就不需要pause了。如果你有什么场景觉得需要pause,可以拿出来大家探讨探讨。


最后,月影在51js上写过一篇文章描述如何通过源代码操作来实现pause(实际上就是代码生成),这个方式理论上可以延伸到实现yield(其实类似于把另一种语言转换或说编译为js啦),但是没有见到进一步深入下去。



场景是这样的:
我的项目里面使用了richfaces,以异步请求方式对表单内容进行后台校验并返回校验结果,这个是在表单提交按钮点击后做的(按钮的onclick事件,受JSF的限制,很难通过javascript去控制表单以JSF的标准提交)。
这样就有个问题,如果校验是异步进行的,没等校验结果返回,onclick事件就成功执行,然后表单就提交了,达不到校验的效果(根据校验结果决定是否提交表单)。
所以,需要有个办法阻止代码在发出异步请求后继续往下走,直到异步请求返回,我实现了一个pause()函数,功能类似Thread.sleep(),是通过模态窗口实现的,但是模态窗口实现有缺陷(大家都知道了,这里不做说明了)。


我尝试了一下XHR的做法,由于每次pause只100毫秒,而且等待异步请求返回时间不长,再加上timeout设置,客户端基本感觉不到假死现象。

附上代码,里面没有timeout设置
前台
	var starttime = new Date().getTime();
	var now = null;
	var gap = 10000;	//超过10秒认为网络不通
	while(null == isValidatePass){  //isValidatePass由校验的异步请求返回后的回调函数中设置
		now = new Date().getTime();					
		if(now - starttime >= gap){
			alert('超时,请稍后再试');
			//throw "超时 " + gap;
			break;
		}else{
			pause(100);
		}
	}



pause函数

function pause(numberMillis) {
	//var dialogScript = 'window.setTimeout(' + ' function () { window.close(); }, ' + numberMillis + ');';
	// For IE5.
	//var result = window.showModalDialog('javascript:document.writeln(' + '"<script>' + dialogScript + '<' + '/script>")');
	 var url = "/test.jsp?delay=" + numberMillis + "&" + Math.random();
	 //alert(url);
	 xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
	 //调用远程服务器,method参数为“get”,使用同步方式

	 xmlHttpRequest.open("GET", url, false);
	 xmlHttpRequest.send(null); 
}


0 请登录后投票
   发表时间:2009-02-04  
JSF自己有校验机制,为什么不用呢?

如果要自己的校验,则可以直接使用同步校验啊。或者直接在返回页面中产生校验失败的信息(就如同传统的表单页面)——毕竟即使使用ajax,服务器总是要校验数据的。

月影的文章地址是:http://bbs.51js.com/viewthread.php?tid=66361
但是注意,此文只适用于有志于探索JS的同志,不建议在实际应用中采用。
0 请登录后投票
   发表时间:2009-02-04   最后修改:2009-02-04
hax 写道
JSF自己有校验机制,为什么不用呢?

如果要自己的校验,则可以直接使用同步校验啊。或者直接在返回页面中产生校验失败的信息(就如同传统的表单页面)——毕竟即使使用ajax,服务器总是要校验数据的。

月影的文章地址是:http://bbs.51js.com/viewthread.php?tid=66361
但是注意,此文只适用于有志于探索JS的同志,不建议在实际应用中采用。


ajax可以增强用户体验。
又不想修改richfaces。

月影用的是闭包原理,并不能阻止form submit事件往外传递,恢复时也不能使form继续提交,不能满足我的要求
0 请登录后投票
论坛首页 Web前端技术版

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