Prototype中Ajax同步调用
用了快两年的Ajax了,一直都是异步调用,所有做的网站都采用前三层后三层的设计模式.对于一些页面,全部采用异步调用后,对于需要判断一些值是否存在时,很不方便,因为是异步请求,没法判断请求结果是否回来,所以开始都是采用等待的方式.
还有对于一些静态发布的网站的页面中,如果要发表评论(比如说只能登录后才能发布),因为是静态发布的,你不能在模板的页面加载中去调用用户信息
如页面形式为:
<html>
<body>
<div>ShowPostCommentDiv();
</body>
</html>
公共js文件
ShowPostCommentDiv()
{
如果用户登录了则显示发表评论Form
否则显示用户登录的form
}
像这样的处理,比如说你在<body 的onload事件调用发送获取用户是否登录的请求,获取用户信息.但是在页面执行到ShowPostCommentDiv()这个函数时,请求基本上没有返回来的,这时候异步很不友好.
如果硬要使用异步调用的话,
只能将
Var ShowPostCommentDiv=function()
{
New AjaxRequest(url,onCommplte: sShowPostCommentDiv)
}
然后在
Var sShowPostCommentDiv=function()
{
如果用户登录了则显示发表评论Form
否则显示用户登录的form
}
但是这样很不合理.
页面中的代码显得相当不合理,所以我采用Ajax的同步调用
代码例子如下:
_mUserExt=null;
//判断用户是否已经登录
var IsUserLogin=function()
{
if(_mUserExt==null)
_mUserExt=LoadUserInfoSynchronous();
if(_mUserExt!=null && _mUserExt.UserId!="")
{
return true;
}
else
{
return false;
}
};
/**同步加载用户信息**/
var LoadUserInfoSynchronous=function()
{
_mUserExt=null;
var url = encodeURI(Action_Path_Get_User_Session);
var pars= encodeURI('');
var myAjax = new Ajax.Request(url,{method: 'get', asynchronous: false,parameters: pars,requestHeaders:['Accept', 'application/xml,text/xml'],onComplete: function(e){
_mUserExt=MapUserExt(e);
},onFailure:function(e){_mUserExt=null;}});
return _mUserExt;
};
/**
//函数解释
asynchronous: false //采用同步调用
requestHeaders:['Accept', 'application/xml,text/xml']请求的服务器类型只能是返回xml类型的数据
执行成功时,调用
onComplete: function(e){
_mUserExt=MapUserExt(e);
},
执行失败时调用
onFailure:function(e){_mUserExt=null;}
***/
/****JS将Xml文档转换成JS对像列表的函数***/
Var MapUserExt=function(o)
{
….
}
Var ShowPostCommentDiv=function()
{
If(IsUserLogin())
{
显示发表评论
}
Else
{
显示用户登录.
}
}
对于这种要求请求服务器判断,并且异步请求不能确定返回结果的处理,采用同步,这样Js就完全可以做到服务器脚本做的事情了,而且也是无刷新,一举两得.
还有对于一些静态发布的网站的页面中,如果要发表评论(比如说只能登录后才能发布),因为是静态发布的,你不能在模板的页面加载中去调用用户信息
如页面形式为:
<html>
<body>
<div>ShowPostCommentDiv();
</body>
</html>
公共js文件
ShowPostCommentDiv()
{
如果用户登录了则显示发表评论Form
否则显示用户登录的form
}
像这样的处理,比如说你在<body 的onload事件调用发送获取用户是否登录的请求,获取用户信息.但是在页面执行到ShowPostCommentDiv()这个函数时,请求基本上没有返回来的,这时候异步很不友好.
如果硬要使用异步调用的话,
只能将
Var ShowPostCommentDiv=function()
{
New AjaxRequest(url,onCommplte: sShowPostCommentDiv)
}
然后在
Var sShowPostCommentDiv=function()
{
如果用户登录了则显示发表评论Form
否则显示用户登录的form
}
但是这样很不合理.
页面中的代码显得相当不合理,所以我采用Ajax的同步调用
代码例子如下:
_mUserExt=null;
//判断用户是否已经登录
var IsUserLogin=function()
{
if(_mUserExt==null)
_mUserExt=LoadUserInfoSynchronous();
if(_mUserExt!=null && _mUserExt.UserId!="")
{
return true;
}
else
{
return false;
}
};
/**同步加载用户信息**/
var LoadUserInfoSynchronous=function()
{
_mUserExt=null;
var url = encodeURI(Action_Path_Get_User_Session);
var pars= encodeURI('');
var myAjax = new Ajax.Request(url,{method: 'get', asynchronous: false,parameters: pars,requestHeaders:['Accept', 'application/xml,text/xml'],onComplete: function(e){
_mUserExt=MapUserExt(e);
},onFailure:function(e){_mUserExt=null;}});
return _mUserExt;
};
/**
//函数解释
asynchronous: false //采用同步调用
requestHeaders:['Accept', 'application/xml,text/xml']请求的服务器类型只能是返回xml类型的数据
执行成功时,调用
onComplete: function(e){
_mUserExt=MapUserExt(e);
},
执行失败时调用
onFailure:function(e){_mUserExt=null;}
***/
/****JS将Xml文档转换成JS对像列表的函数***/
Var MapUserExt=function(o)
{
….
}
Var ShowPostCommentDiv=function()
{
If(IsUserLogin())
{
显示发表评论
}
Else
{
显示用户登录.
}
}
对于这种要求请求服务器判断,并且异步请求不能确定返回结果的处理,采用同步,这样Js就完全可以做到服务器脚本做的事情了,而且也是无刷新,一举两得.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fibona/archive/2008/04/10/2279496.aspx