XCO請求是基于AJAX的異步請求,和普通的AJAX請求區(qū)別在于:
application/xco;charset=utf-8
;
xco.jquery-{version}.js
提供了XCO請求的具體實現(xiàn),從名字上我們大致可以看出,XCO請求從實現(xiàn)角度,是基于jquery的,因此在使用XCO請求的時候,我們也需要引入jquery類庫。
<button type="button" name="t1" onclick="doSubmit()">XCO請求</button>
<script type="text/javascript" src="/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="/js/xco-1.0.1.js"></script>
<script type="text/javascript" src="/js/xco.jquery-1.0.1.js"></script>
<script type="text/javascript">
function doSubmit() {
var xco = new XCO();
xco.setIntegerValue("id", 1);
xco.setStringValue("name", "張三");
var options = {
url : "/m1.xco", //請求的URL地址
data : xco, //請求的參數(shù),必須為XCO對象
success : doCallBack //成功后的回調(diào)函數(shù)
};
$.doXcoRequest(options);
}
function doCallBack(data) {
// 這里的data是一個XCO對象
alert('doCallBack:\n' + data);
}
</script>
說明:關于服務端的接收和處理,可參考<http://www.xson.org/project/web/1.2.0/>
對于請求成功后的處理,XCO請求還提供多回調(diào)函數(shù)的支持。
function doSubmit() { var xco = new XCO(); xco.setIntegerValue("id", 1); xco.setStringValue("name", "張三"); var options = { url : "/m1.xco", //請求的URL地址 data : xco, //請求的參數(shù),必須為XCO對象 success : [ doCallBack1, doCallBack2, doCallBack3 ] }; $.doXcoRequest(options); }
function doCallBack1(data) {
// TODO
}
function doCallBack2(data) {
// TODO
}
function doCallBack3(data) {
// TODO
}
XCO請求返回的結(jié)果是一個XCO對象,我們可以通過XCO對象的getCode
方法拿到請求的狀態(tài)代碼(一般情況下,0代表處理成功,非0代表處理失敗),通過getMessage
方法拿到錯誤信息。對于返回結(jié)果,我們往往會先檢測其狀態(tài)代碼,然后再做業(yè)務處理;我們先看一個示例:
示例1
function doCallBack(data) { if(1 == data.getCode()){ alert(data.getMessage()); // 處理錯誤碼1 return; } if(2 == data.getCode()){ alert(data.getMessage()); // 處理錯誤碼2 return; } ... if(0 == data.getCode()){ // 處理正常業(yè)務 } }
現(xiàn)在,我們可以使用另一種方式來實現(xiàn)上面的功能:
示例2
function doSubmit() { var xco = new XCO(); xco.setIntegerValue("id", 1); xco.setStringValue("name", "張三"); var options = { url : "/m1.xco", //請求的URL地址 data : xco, //請求的參數(shù),必須為XCO對象 success : doCallBack, //成功后的回調(diào)函數(shù) detector : doDetector //結(jié)果檢測:該函數(shù)只有返回true,success回調(diào)才會執(zhí)行 }; $.doXcoRequest(options); }
function doDetector(data) { if(0 == data.getCode()){ return true; } if(1 == data.getCode()){ alert(data.getMessage()); // 處理錯誤碼1 } else if(2 == data.getCode()){ alert(data.getMessage()); // 處理錯誤碼2 } return false; }
function doCallBack(data) { // 處理正常業(yè)務 }
示例3
function doSubmit() { var xco = new XCO(); xco.setIntegerValue("id", 1); xco.setStringValue("name", "張三"); var options = { url : "/m1.xco", //請求的URL地址 data : xco, //請求的參數(shù),必須為XCO對象 success : doCallBack, //成功后的回調(diào)函數(shù) detector : [doDetector1, doDetector2] }; $.doXcoRequest(options); } function doDetector1(data) { if(1 == data.getCode()){ alert(data.getMessage()); // 處理錯誤碼1 return false; } return true; } function doDetector2(data) { if(2 == data.getCode()){ alert(data.getMessage()); // 處理錯誤碼2 return false; } return true; }
示例3中,我們使用了兩個結(jié)果檢測函數(shù),只有這兩個檢測函數(shù)都返回true,success回調(diào)才會執(zhí)行,任何一個檢測函數(shù)返回false,都將結(jié)束回調(diào)流程。
如果我們希望先檢測code是否為0,如果為0后續(xù)則無需再做檢測,該如何做呢?我們可以將示例3中的代碼做如下改動:
function doDetector1(data) { if(0 == data.getCode()){ return IGNORE_FOLLOW_UP; //返回特殊標記,忽略后續(xù)結(jié)果檢測 } // 其他結(jié)果檢測 }
更多建議: