ajax深层问题:对象锁定

wuyg719 2006-02-20 01:46:22
因为异步处理模式,有可能并发执行吗?
如果并发执行,如何锁定对象?
...全文
554 31 打赏 收藏 转发到动态 举报
写回复
用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)

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧