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