社区
Ajax
帖子详情
ajax深层问题:对象锁定
wuyg719
2006-02-20 01:46:22
因为异步处理模式,有可能并发执行吗?
如果并发执行,如何锁定对象?
...全文
554
31
打赏
收藏
ajax深层问题:对象锁定
因为异步处理模式,有可能并发执行吗? 如果并发执行,如何锁定对象?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
31 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
blueonly
2006-03-22
打赏
举报
回复
woooooooooooooooooo
wuyg719
2006-03-21
打赏
举报
回复
再顶一次
wuyg719
2006-03-20
打赏
举报
回复
是指javascript的异步问题,不是ActiveXObject对象。
zhouzhenxin
2006-03-19
打赏
举报
回复
我有点不明白,
xmlHeadDoc = new ActiveXObject("Microsoft.XMLDOM");
他不是new出来的吗?new 不是在内存中有多个副本吗?
多个副本之间有同步和异步发生吗?
不明白,希望高手指点。
wuyg719
2006-03-19
打赏
举报
回复
我的代码如下:
<html>
<head>
<title>
XMLUpdate
</title>
</head>
<script type="text/javascript">
var xmlHeadDoc;
var x=10;
function fireUpdate(seq){
var xmlURL="table?type=TYPE1";
if (window.ActiveXObject){
//code for MS IE
xmlHeadDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlHeadDoc.async=true;
xmlHeadDoc.load( xmlURL );
xmlHeadDoc.onreadystatechange = function () {
if (xmlHeadDoc.readyState == 4 ){ //&& xmlhttp.status == 200) {
if(seq==1){
timeCostumer();
}else{
LoadHandler();
}
}
};
} else if (document.implementation && document.implementation.createDocument){
// code fore firefox
var xmlhttp=new XMLHttpRequest();
if (xmlhttp != null) {
xmlhttp.open("GET",xmlURL,true); //(String method, String URL, boolean asynchronous)
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 ){ //&& xmlhttp.status == 200) {
if(seq==1){
timeCostumer();
}else{
LoadHandler();
}
}
};
xmlhttp.send(null);
}
} else {
alert('Your browser cannot handle this script');
return;
}
}
function LoadHandler () {
x=8;
document.forms[0].fastFlag.value="LoadHandler";
}
function timeCostumer () {
document.forms[0].slowFlag.value="timeCostumer start...";
var y=1.5;
for (var i=0; i < 1000; i++) {
for (var j=0; j <1000; j++) {
y=y*1.002;
y=y/1.001;
}
}
document.forms[0].myData.value=x;
}
</script>
<body bgcolor="#ffffff">
<h1>test synchronized confliction problem</h1>
<form name="form1" method="post" action="">
<br/>
<a href='table?type=TYPE1'>This is the XML sample </a><br/>
<br/><br/><br/>
Slow Flag<input type="text" name="slowFlag"/><br/>
Fast Flag<input type="text" name="fastFlag"/><br/>
Data<input type="text" name="myData"/><br/>
<br/>
<input type="button" name="test" value="slow operation" onclick="javascript:fireUpdate(1);"><br/>
<input type="button" name="test" value="fast operation" onclick="javascript:fireUpdate(2);">
</form>
</body>
</html>
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class table extends HttpServlet {
private static final String CONTENT_TYPE = "text/xml";
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String type = request.getParameter("type");
if (type == null) {
type = "TYPE1";
}
// HttpSession session=request.getSession();
// System.out.println("session.set.value = "+session.getAttribute("session.set.value"));
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
//out.println("<?xml version=\"1.0\"?>");
out.println("<?xml version='1.0' encoding='GB2312'?>");
// out.println("<?xml version='1.0' encoding='UTF-8'?>");
try{
if ("TYPE1".equals(type)) {
Thread.sleep(1000 * 1); //test client xml asynchronous method
}
}catch(Exception e){
throw new ServletException(e.getMessage());
}
out.println("<root>");
if (type.equals("TYPE1")){
out.println("<table name='Type1.code--1'></table>");
out.println("<table name='Type1.code--2'></table>");
out.println("<table name='Type1.code--3'></table>");
}
else{
out.println("<table name='Type2.code--a'></table>");
out.println("<table name='Type2.code--b'></table>");
out.println("<table name='Type2.code--c'></table>");
out.println("<table name='Type2.code--d'></table>");
out.println("<table name='Type2.code--e'></table>");
out.println("<table name='Type2.code--f'></table>");
out.println("<table name='Type2.code--g'></table>");
}
out.println("</root>");
}
//Clean up resources
public void destroy() {
}
}
hax
2006-03-15
打赏
举报
回复
你说ie会有一个不执行,应该是你在使用XMLHttpRequest时候的问题,你可以把代码贴上来让大家看看。至于“激活js在执行需要很长时间”,不明白你什么意思。
wuyg719
2006-03-14
打赏
举报
回复
我的目的是刺探ajax是否有漏洞,因为异步处理在出现问题的时候是非常难调试的。
我的测试表明在ie中是存在问题的,我没有用ajax的现成代码,所有代码都是我自己写的。
所以我不知道ajax是否有更好的措施预防这类问题。
hax
2006-03-11
打赏
举报
回复
那个模拟大概是任务队列吧,轮询之后不符合条件的把自己扔回到队列中。但是执行时其实仍然是独占的,无法中断下来。js的单线程的限制总是无法绕过。。。
cds27
2006-03-10
打赏
举报
回复
不了解你的目的,没办法发表什么观点。只是觉得没什么必要一定让慢的JS追上快的JS。
如果一定要做,那你用JS模拟多线程。关于这个主题,在JS版有个帖子讨论过。你去找一下。
wuyg719
2006-03-10
打赏
举报
回复
to 冰封.
你用两个XMLHTTP来接受数据?
我是这样设计的。
button a call a1(启动XMLHTTP),
button b call b1(启动XMLHTTP),
a1 call back a2()//慢的js
b1 call back b2()//快的js
有什么问题吗?
wuyg719
2006-03-10
打赏
举报
回复
有些文字错误,修改如下:
我反复调整XMLHttpRequest得到数据的时间和和我点击的时间,得到的完整的结论如下:
当慢的js正在被调用的时候,再点击第二个按钮,在firefox里,不能被点击
在ie里,能够被点击,但必须等到慢的js被执行完毕之后才执行。
当慢的js在执行过程中或等待执行过程中快的js被调用,
此时在firefox中,快的js等到慢的js执行完毕之后才执行。
在ie中更邪门,慢的js居然不执行了。
感觉在ie中,得到XMLHttpRequest数据之后,激活js在执行需要很长时间,
(这就是所谓的等待执行过程中),而firefox很快。
所以我不知道在ie中如何得到一次机会让慢的js在执行过程中被快的追上。
希望各位大侠出点主意。
cds27
2006-03-08
打赏
举报
回复
你用两个XMLHTTP来接受数据?
slayerbb
2006-03-07
打赏
举报
回复
多多讨论吧
呵呵
争论是最好的提高方式之一
wuyg719
2006-03-07
打赏
举报
回复
所以我的结论是ajax还是一个很危险的处理过程。你们怎么看?
wuyg719
2006-03-07
打赏
举报
回复
我反复调整XMLHttpRequest得到数据的时间和和我点击的时间,得到的完整的结论如下:
当慢的js正在被调用的时候,再点击第二个按钮,在firefox里,不能被点击
在ie里,能够被点击,但必须等到慢的js被执行完毕。
当慢的js还没有被调用的时候,再点击第二个按钮,快的js抢先执行
当慢的js在执行过程中或等待执行过程中快的js被调用,此时在firefox中,快的js等到慢的js执行完毕之后才
执行。在ie中更邪门,慢的js居然不执行了。
感觉在ie中,得到XMLHttpRequest数据之后,激活js在执行需要很长时间,
所以我不知道在ie中如何得道一次机会让慢的js在执行过被快的追上。
希望各位大侠出点主意。
wuyg719
2006-03-07
打赏
举报
回复
感谢各位大侠对我的支持,很汗颜的是我确实不知道JS是单线程的,尽管我已经写了好几年js了,
所以我才有上面的问题。
所以昨天我抽了一点时间做了一个测试。测试过程如下:
我首先设计了两个js 函数,一个非常快(修改一个全局变量),一个很慢(最后显示这个全局变量),然后又设计一个非常快的XMLHttpRequest返回。
两个按钮分别异步执行XMLHttpRequest后call back两个js 函数。比较麻烦的是现在的浏览器如firefox和ie都对js的执行时间限得比较死,时间稍微长一点就弹出警告对话框。
然后我先点击慢的,接着马上点击快的,再firefox结果是,快的被阻塞了。
hax
2006-03-03
打赏
举报
回复
to emu: 异步是有优点。但是我前面提出的程序复杂度和调试问题,确实也存在哦。如果不使用一些更好的模式,直接写大量回调,可能会造成维护上的困难。不知道这一点上,你有什么好主意?
我个人想了一个方法(最近在总结写文章出来)能一定程度上把异步代码搞成根同步代码一样,并且可以在同步和异步中切换,比如做原型的时候使用同步,先把业务逻辑搞对。将来实际使用中,再改为异步,这样出现bug你也知道是出在异步环节,而不是业务逻辑的错误。
to cds27: 你前面讲的都很好,就是最后一段多余了。我觉得楼主能提出这样的问题,正说明他对ajax还是有想法的。一般的coder会想到ajax的多线程问题吗?大家不必意气嘛。
hax
2006-03-03
打赏
举报
回复
to emu: "控件的工作还可以继续,甚至可以继续调用脚本" 俺不同意你的说法。脚本引擎是单线程的,继续调用应该是没门的。。。只能把调用先堵塞在那里。不过话说回来,我没有全面测试过,而且印象当中ie和ff在这件事情上的处理似乎有所不同,ff似乎更严格,ie貌似有些控件包成js对象包的不严实,一些native代码有时候会不按js牌理出牌也不一定。。。
cds27
2006-03-03
打赏
举报
回复
我说的意思是,楼主考虑的问题是多余的。
理由:
JS是单线程,这已经是众所周知的事,假如楼主不知道,那就另当别论。
那么,我就不理解了。楼主所说的异步指的是哪个地方?无非是AJAX中用到的XMLHTTP(
目前大家用的AJAX,我相信都是基于MS的XMLHTTP)。
再说,ACTIVEX本身就就在JS的进程外,XMLHTTP的接收数据本身就不会妨碍用户的操作,既然如此,楼主要讨论什么呢?讨论别人做的东西,有啥意义呢?要不就自己搞一个,技术上也不是很难的事。
最后,唯一的瓶颈就是onreadystatechange执行的时候。当收到数据做处理的时候,做的操作有可能妨碍用户的操作。但是这里得提一下,会不会妨碍用户的操作,完全是设计者自身水平的问题。一般情况下是由于数据量大,导致处理时间过长。从这点考虑,我个人认为至少有两种方法可以解决这个问题。一种是将数据分次传输,分次触发,减少数据接受后处理的时间。另一种是一次接收所有数据,然后间隔性地进行处理,把处理时间分摊掉。
总结一下,根据楼主的意思,应该不是在onreadystatechange的时候,他似乎认为用了AJAX就会自动的完成后台的操作。这难道不是想当然?还有从他最初的问题,他想锁定的是什么对象?他的问题,一开始就会让人认为他讨论的是服务端的问题。在客户端能锁定什么对象(当然,这里指的是一般情况)?在客户端去讨论锁定什么对象,显然是多余的。所以我说楼主,根本就不理解什么是AJAX,或者不理解AJAX的现状,更像是一个刚刚接触了AJAX,觉得它有多么神奇的新手。
emu
2006-03-03
打赏
举报
回复
xmlhttp控件是activex控件,它的事件触发和处理和页面脚本并不是同步的,如果脚本的运行被堵塞了(比如alert),控件的工作还可以继续,甚至可以继续调用脚本(也可以同时打出来多个alert,各自堵塞自己的脚本线程)。
同步不是一种好的方式。同步方式的xmlhttp调用堵塞了整个页面的脚本运行(如果在页面解析过程中还会堵塞页面解析过程),不但使得我们的页面无法继续相应用户新的交互,而且使我们的脚本失去了对xmlhttp控件的控制能力(在异步方式下可以主动abort)。
我认为同步调用唯一的好处就是:可以偷懒。不需要写回调函数了,程序可以顺着写下来。如果贪图简单易写不注重用户感受,何必ajax呢?有很多传统技术可以用啊。
加载更多回复(11)
java 比较两个json
对象
_比较任意两个JSON串是否相等(比较
对象
是否相等)JAVA版
在面向
对象
语言中,经常会比较两个
对象
是否相等,而比较的大多是实体类实例,也就是封装数据的那些类实例,或者是Map、List互相嵌套成的复杂数据结构。比较
对象
是否相等,常见的思路是重写equals方法,但鉴于
对象
的...
5JQuery与
Ajax
遍历其中的json
对象
,key对应每个json
对象
的key,value对应每个json
对象
的值。如: var string1='[{"id":30,"name":"wjjjjj"},{"id":60,"name":"dgfej"}]'; var kk=JSON.parse(string1,function(key,value){ ...
2.4 JAVA并发编程核心知识汇总(线程同步和线程池)
volatile变量详细可参考敖丙的
深层
原理: https://mp.weixin.qq.com/s/Oa3tcfAFO9IgsbE22C5TEg JAVA多线程 多线程 这个技术是什么 进程:每个正在系统上运行的程序都是一个进程。每个...
ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解
如果我们更深入地来理解这个
问题
,JavaScript 对于
对象
的传递则是按共享传递的(pass-by-sharing,也叫按
对象
传递、按
对象
共享传递)。最早由Barbara Liskov. 在1974年的GLU语言中提出;该求值策略被用于Python、...
python可以解决哪些
问题
_python面试
问题
面向
对象
4. 语法简洁5. 开源6. 丰富的社区资源深拷贝和浅拷贝有什么区别?答: 浅拷贝在创建新实例类型时会用到,并保留在新实例中复制的值。浅拷贝用于复制引用指针,就像复制值一样。这些引用指向原始
对象
,并且...
Ajax
52,797
社区成员
25,305
社区内容
发帖
与我相关
我的任务
Ajax
Web 开发 Ajax
复制链接
扫一扫
分享
社区描述
Web 开发 Ajax
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章