XCO请求是基于AJAX的异步请求,和普通的AJAX请求区别在于:
xco.jquery-{version}.js提供了XCO请求的具体实现,从名字上我们大致可以看出,XCO请求从实现角度,是基于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, //请求的参数,必须为XCO对象 success : doCallBack //成功后的回调函数 }; $.doXcoRequest(options); } function doCallBack(data) { // 这里的data是一个XCO对象 alert('doCallBack:\n' + data); } </script>
说明:关于服务端的接收和处理,可参考http://www.xson.org/project/web/1.2.0/
对于请求成功后的处理,XCO请求还提供多回调函数的支持。
function doSubmit() { var xco = new XCO(); xco.setIntegerValue("id", 1); xco.setStringValue("name", "张三"); var options = { url : "/m1.xco", //请求的URL地址 data : xco, //请求的参数,必须为XCO对象 success : [ doCallBack1, doCallBack2, doCallBack3 ] }; $.doXcoRequest(options); } function doCallBack1(data) { // TODO } function doCallBack2(data) { // TODO } function doCallBack3(data) { // TODO }
XCO请求返回的结果是一个XCO对象,我们可以通过XCO对象的getCode方法拿到请求的状态代码(一般情况下,0代表处理成功,非0代表处理失败),通过getMessage方法拿到错误信息。对于返回结果,我们往往会先检测其状态代码,然后再做业务处理;我们先看一个示例:
示例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()){ // 处理正常业务 } }
现在,我们可以使用另一种方式来实现上面的功能:
示例2
function doSubmit() { var xco = new XCO(); xco.setIntegerValue("id", 1); xco.setStringValue("name", "张三"); var options = { url : "/m1.xco", //请求的URL地址 data : xco, //请求的参数,必须为XCO对象 success : doCallBack, //成功后的回调函数 detector : doDetector //结果检测:该函数只有返回true,success回调才会执行 }; $.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) { // 处理正常业务 }
示例3
function doSubmit() { var xco = new XCO(); xco.setIntegerValue("id", 1); xco.setStringValue("name", "张三"); var options = { url : "/m1.xco", //请求的URL地址 data : xco, //请求的参数,必须为XCO对象 success : doCallBack, //成功后的回调函数 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中,我们使用了两个结果检测函数,只有这两个检测函数都返回true,success回调才会执行,任何一个检测函数返回false,都将结束回调流程。
如果我们希望先检测code是否为0,如果为0后续则无需再做检测,该如何做呢?我们可以将示例3中的代码做如下改动:
function doDetector1(data) { if(0 == data.getCode()){ return IGNORE_FOLLOW_UP; //返回特殊标记,忽略后续结果检测 } // 其他结果检测 }