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就完全可以做到服務器腳本做的事情了,而且也是無刷新,一舉兩得.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.