flex 事件异步导致代码顺序不利于阅读
source:http://hi.baidu.com/chensong_blog/blog/item/56240f16a4ad064321a4e91d.html
做项目时,用RemoteObject对象发现如果一个页面上调用多个方法,此时如果每个方法的出错处理提示和处理结果不同时,必须要给每个方法写一个回调方法,因此,我们采用代理执行,具体代码如下:
package com.system {
import com.reider.log4AS3.Logger;
import com.reider.log4AS3.LoggerFactory;
import mx.rpc.AbstractOperation;
import mx.rpc.AsyncResponder;
import mx.rpc.AsyncToken;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.RemoteObject;
/**
* 和后台数据交互的代理
*/
public class ServiceProxy {
private static var logger:Logger = LoggerFactory.getLogger(ServiceProxy);
/**
* 创建代理后执行此方法,并返回数据
* @param serviceName
* @param methodName
* @param onResult 回调函数,有两个参数:类型:boolean,标识远程调用结果;类型:Object,远程调用返回数据
* @param params 参数(多个参数中间用逗号隔开)
*/
public static function execute(serviceName:String, methodName:String, onResult:Function, ... params:Array):void {
logger.debug("execute start");
var service:RemoteObject = new RemoteObject(serviceName);
service.endpoint = "http://ip:port/contextpath/messagebroker/amf";
var asyncToken:AsyncToken;
var operation:AbstractOperation = service.getOperation(methodName);
if (params && params.length != 0) {
asyncToken = operation.send.apply(operation, params);
} else {
asyncToken = operation.send();
}
asyncToken.addResponder(new AsyncResponder(
function(event:ResultEvent, asyncToken:AsyncToken):void {
onResult(true,event.result);
},
function(event:FaultEvent, asyncToken:AsyncToken):void {
onResult(false, event.message);
},
asyncToken
));
logger.debug("execute end");
}
}
}
调用示例如下:
private function goToPage(no:Number):void{
ServiceProxy.execute("PageService","getPage",function(success:Boolean, data:Object):void {
if(!success){
Alert.show("数据库异常");
}else{
。。。。。成功调用后的处理
}
},encodeURI(hql),no,this.totalRows);
}