Prototype中Ajax同步调用

14年前
用了快两年的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就完全可以做到服务器脚本做的事情了,而且也是无刷新,一举两得.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fibona/archive/2008/04/10/2279496.aspx