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
本文由用戶 wf1006 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!