FLEX 用RemoteObject同时调用多个服务端函数,且指定每个调用的回调处理函数 (附下载地址)
2009-04-20 13:34
447 查看
在用到FLEX的AMF信道进行远程通讯过程中,很多人都碰到一个问题:实例化一个RemoteObject对象,调用多个服务端函数和指定resultHandler()来作不同的处理。
而且我们希望远程函数调用与本地的函数调用区别开来,新手进来也不容易困惑~!
下面我们来讲讲以上的问题怎么解决!
以下为升级版的补充说明:Flex远程调用批量打包通讯库
批量远程通讯接口类
建议所有请求都使用本类
数据缓冲池对象(FXGlobalModel)的rpc是本类的实例
使用的方法:
1、基于数据缓冲池访问WS:设置onFault; onResult; addCaller; 即可
2、远程调用:如需要全部请求返回后进行回调处理,则设置 onAllResult; onAllFault; 这时,调用 commit 后才会提交addDSCaller、addCaller的请求
3、请用WSRemoteObject 此类,不要直接用HtRemoteObject
4、返回的格式为:{ code: 0, ret: Object }, 错误时为:{ code: numErrorCode, what: strErrorMsg }
5、最佳使用方式:在某个单例对象中实例化WSRemoteObject :public var rpc:WSRemoteObject; 调用时可以 XXX.rpc....这样操作,如:
设置:
1、请在工程的编译参数加入-services引用此标准的RO设置(./WEB-INF/flex/services-config.xml)
2、以上文件包含此项endpoint(动态取URL值):<endpoint uri="http://{server.name}:{server.port}/{context.root}/[page.php|aspx|jsp]" class="flex.messaging.endpoints.AMFEndpoint"/>(请参考官方讲解)
3、debug开启时,可用FXConfig.SERVER_URL指定通讯地址
4、destination可通过FXConfig.CURR_DESTINATION 指定,但建议用-services的指定,如asp.net的为 fluorine ,php的为zend 或 amfphp 等等,具体看用哪种服务端
补:使用时请详细查看API参考里的 FXConfig 类与 WSRemoteObject 类,再有就是 WSRemoteObject 支持的事件:RpcEvent.RPC_ERROR 此事件会在返回值code > 0 时发出,可以这样处理:
附下载地址:http://code.google.com/p/flex-rpc/
请看完这个:http://code.google.com/p/flex-rpc/wiki/FlexRPC_Help
而且我们希望远程函数调用与本地的函数调用区别开来,新手进来也不容易困惑~!
下面我们来讲讲以上的问题怎么解决!
//1、派生一个RemoteObject来实现我们想要的功能 public class HtRemoteObject extends mx.rpc.remoting.mxml.RemoteObject
//指定默认的失败回调函数,成功的回调在创建远程调用时指定,不需要默认的,这样在我们使用时只要指定成功的回调就行了,失败的就用默认的,这样省去每次都要指定两个回调的麻烦。 public var onResult:Function=null; public var onFault:Function = HtRemoteObject.onFaultDefault; // 用户自定义对象,在返回的事件中 e.token.ids 中可获取到,要扩展远程调用就是简单的事情了,哈哈。 public var ids:Object=null; /** * 构造函数 * @param destination 网关的终点 * @param source 远端函数的命名空间和类名,也就是远端函数所处的位置 * @param debug 是否连接调试服务器(调试模式) * @param showBusyCursor 是否显示鼠标忙指针 * */ public function HtRemoteObject(destination:String=null, source:String=null, debug:Boolean=false, showBusyCursor:Boolean=false) { if(destination==null) destination=HtRemoteObject.DESTINATION; if(source==null) source=HtRemoteObject.SysInfoInterface; super(destination); super.source=source; super.showBusyCursor=showBusyCursor; //鼠标指针忙 if (debug || fdgModel.config.isDebug) { //fdgModel为我的数据模型,大家可以自行构造自己的数据模型。 super.endpoint=fdgModel.config.serverUrl + "/Gateway.aspx";//指定服务器端点调试时使用 } } /** * 远程通讯,默认的失败处理函数 * @param e 事件 * */ static public function onFaultDefault(e:FaultEvent):void { CursorManager.removeBusyCursor(); try { throw new HtError("远程服务器错误:" + mx.utils.ObjectUtil.toString(e), e.fault.faultCode as int); } catch (err:Error) { ht.errors.HtError.showError(err); } }
/** * 远程调用 Server 中的函数 * @foo 函数名 * @args 参数列表 */ public function call(foo:String, ...args):void { if(foo.length==0) throw new Error("foo can not be empty!"); //创建一个远程调用函数 var operation:AbstractOperation=this.getOperation(foo); //Token var call:AsyncToken = operation.send.apply(null, args); // ids 中承载了处理函数和用户自定义ids,在 onDSResultParser onFaultParser 中解析和处理 var idsWapper : Object = new Object; //使用自定的错误回调函数由onFaultParser调度,使用前要设定this.onFault idsWapper.onFaultCB = this.onFault; //使用自定的正确回调函数由onResultParser调度,使用时要设定this.onResult idsWapper.onResultCB = this.onResult; idsWapper.ids = this.ids; //如果要显示进程 idsWapper.progress = progress; call.ids = idsWapper; //设定回调处理器 call.addResponder(new mx.rpc.Responder(HtRemoteObject.onResultParser, HtRemoteObject.onFaultParser) as IResponder); } /** * 处理服务器返回的数据,如果正确,则调用'数据返回回调',错误则调用'错误处理回调' * @param evt 成功事件 * */ static protected function onResultParser(e:ResultEvent):void { try { var idsWapper : Object = e.token.ids; // 删除进度条对象 if (null != idsWapper.progress) { var progress : UIComponent = idsWapper.progress as UIComponent; idsWapper.progress = null; if (null != progress && null != progress.parent && progress.parent.contains(progress)) progress.parent.removeChild(progress); } CursorManager.removeBusyCursor(); var onResult : Function = idsWapper.onResultCB as Function; e.token.ids = idsWapper.ids; if (null != onResult) onResult (e); } catch(err:Error) { ht.errors.HtError.showError(err); } } static protected function onFaultParser(e:FaultEvent):void { try { var idsWapper : Object = e.token.ids; // 删除进度条对象 if (null != idsWapper.progress) { var progress : UIComponent = idsWapper.progress as UIComponent; idsWapper.progress = null; if (null != progress && null != progress.parent && progress.parent.contains(progress)) progress.parent.removeChild(progress); } CursorManager.removeBusyCursor(); var onFault : Function = idsWapper.onFaultCB as Function; e.token.ids = idsWapper.ids; if (null == onFault) onFault = HtRemoteObject.onFaultDefault; onFault(e); } catch(err:Error) { ht.errors.HtError.showError(err); } }
以下为升级版的补充说明:Flex远程调用批量打包通讯库
批量远程通讯接口类
建议所有请求都使用本类
数据缓冲池对象(FXGlobalModel)的rpc是本类的实例
使用的方法:
1、基于数据缓冲池访问WS:设置onFault; onResult; addCaller; 即可
2、远程调用:如需要全部请求返回后进行回调处理,则设置 onAllResult; onAllFault; 这时,调用 commit 后才会提交addDSCaller、addCaller的请求
3、请用WSRemoteObject 此类,不要直接用HtRemoteObject
4、返回的格式为:{ code: 0, ret: Object }, 错误时为:{ code: numErrorCode, what: strErrorMsg }
5、最佳使用方式:在某个单例对象中实例化WSRemoteObject :public var rpc:WSRemoteObject; 调用时可以 XXX.rpc....这样操作,如:
XXX.currModel.rpc.onFault = onQueryFault; XXX.currModel.rpc.onResult = onQueryResult; XXX.currModel.rpc.addCaller(NetHandler.DATA_ACCESS_INTERFACE, "QueryOBD", queryInfo); //此行可以不用, 不用时请在系统的某处判断rpc.callNumber>0时再commit(),也可以设定某个时间间隔来定时做此判断,比如3s或10s也可以1s,就看大家的需要了 XXX.currModel.rpc.commit();
设置:
1、请在工程的编译参数加入-services引用此标准的RO设置(./WEB-INF/flex/services-config.xml)
2、以上文件包含此项endpoint(动态取URL值):<endpoint uri="http://{server.name}:{server.port}/{context.root}/[page.php|aspx|jsp]" class="flex.messaging.endpoints.AMFEndpoint"/>(请参考官方讲解)
3、debug开启时,可用FXConfig.SERVER_URL指定通讯地址
4、destination可通过FXConfig.CURR_DESTINATION 指定,但建议用-services的指定,如asp.net的为 fluorine ,php的为zend 或 amfphp 等等,具体看用哪种服务端
补:使用时请详细查看API参考里的 FXConfig 类与 WSRemoteObject 类,再有就是 WSRemoteObject 支持的事件:RpcEvent.RPC_ERROR 此事件会在返回值code > 0 时发出,可以这样处理:
private function rpcErrorHandler(e:RpcEvent):void { if (e.errorObject is Error) //LogError(e.errorObject as Error); else if (e.errorObject is FaultEvent) //LogErrorEvent(e.errorObject as FaultEvent); }
附下载地址:http://code.google.com/p/flex-rpc/
请看完这个:http://code.google.com/p/flex-rpc/wiki/FlexRPC_Help
相关文章推荐
- FLEX4 用RemoteObject同时调用多个服务端函数,且指定每个调用的回调处理函数(附下载地址)
- 两个线程同时调用同一个处理函数的互斥问题
- C语言学习12:带参数的main函数,无指定的函数形参,调用库函数处理无指定的函数形参,
- 两个以上gameobject同时调用同一函数时候transform代码中改变但是实际效果并不改变的诡异问题
- PHPCMS通过getJSON调用的地址回调函数一直无法执行
- Flex远程调用机制RemoteObject应用技巧(转)
- Flex远程调用机制RemoteObject应用技巧
- Python json序列化时default/object_hook指定函数处理
- 两个线程同时调用同一个处理函数的互斥问题
- 一个remoteobject调用多个java方法(Flex)
- python 使用socket客户端向服务端传参,调用指定函数并返回值给客户端
- Flex一个RemoteObject调用JAVA对象里面的多个方法(转)
- flex remoteobject 调用java重载函数
- CCScheduler(调度器 两种回调1、update回调(通过object的update函数实现所以每次调用) 2、一般回调(通过timer timer是可以设置fSeconds的可变调用间隔))
- 如何将GTK+-2.0的信号、回调处理映射成类成员函数的调用--VC中测试(单类继承)
- Flex4 Spark DataGrid 调用外部函数处理
- flex4 RemoteObject 动态调用 java 代码
- 如何将GTK+-2.0的信号、回调处理映射成类成员函数的调用--示例
- 使用“事件监听/链式事件处理方式”实现window.onload同时调用多个函数
- 如何将GTK+-2.0的信号、回调处理映射成类成员函数的调用--VC中测试(虚拟继承类及多继承)