Apache flex 在ActionScript 3/Flex/AIR中实现1:1异步回调/事件的最佳方法?
在我的Flex项目中,我一直在使用,在以下项目之间需要异步回调路由: 实例化给定命令对象和命令对象的人, 命令对象和数据访问对象,即通过网络处理远程过程调用到命令对象调用的服务器的人。 这两个回调路由中的每一个都必须能够是一对一的关系。这是因为一个给定命令类的多个实例可能同时运行完全相同的作业,但参数略有不同,我不希望它们的回调混淆。因此,使用事件(AS3中处理异步性的默认方式)几乎是过时的,因为它们本质上是基于一对多关系的 目前,我使用带有特定类型签名的回调函数引用来实现这一点,但我想知道是否有人知道更好的方法或替代方法 下面是一个示例来说明我当前的方法: 我可能有一个视图对象,由于某些用户操作而生成DeleteObjectCommand实例,将引用传递给它自己的两个私有成员函数,一个成功,一个失败:在本例中,假设deleteObjectSuccessHandler和deleteObjectFailureHandler作为对命令类构造函数的回调函数引用。 然后,命令对象将通过与数据访问对象的连接重复此模式。 当网络上的RPC成功完成或失败时,将首先由数据访问对象调用相应的回调函数,然后由命令对象调用,最后,首先实例化操作的视图对象通过调用其deleteObjectSuccessHandler或deleteObjectFailureHandler得到通知。Apache flex 在ActionScript 3/Flex/AIR中实现1:1异步回调/事件的最佳方法?,apache-flex,actionscript-3,asynchronous,air,Apache Flex,Actionscript 3,Asynchronous,Air,在我的Flex项目中,我一直在使用,在以下项目之间需要异步回调路由: 实例化给定命令对象和命令对象的人, 命令对象和数据访问对象,即通过网络处理远程过程调用到命令对象调用的服务器的人。 这两个回调路由中的每一个都必须能够是一对一的关系。这是因为一个给定命令类的多个实例可能同时运行完全相同的作业,但参数略有不同,我不希望它们的回调混淆。因此,使用事件(AS3中处理异步性的默认方式)几乎是过时的,因为它们本质上是基于一对多关系的 目前,我使用带有特定类型签名的回调函数引用来实现这一点,但我想知道是否
许多Flex RPC类,如RemoteObject、HTTPService等,在调用它们时返回。听起来这就是你想要的。基本上,AsyncToken封装了挂起的调用,从而可以以实例的形式向特定调用注册回调
在HTTPService的情况下,当您调用send时,将返回一个AsyncToken,您可以使用此对象跟踪特定的调用,这与ResultEvent.RESULT不同,ResultEvent.RESULT无论是哪个调用都会被触发,调用的顺序很容易与发送的顺序不同。许多Flex RPC类,如RemoteObject,HTTPService等。当您呼叫它们时返回。听起来这就是你想要的。基本上,AsyncToken封装了挂起的调用,从而可以以实例的形式向特定调用注册回调
在HTTPService的情况下,当您调用send时,将返回一个AsyncToken,您可以使用此对象跟踪特定的调用,这与ResultEvent.RESULT不同,ResultEvent.RESULT无论是哪个调用都会被触发,并且调用的顺序很容易与发送的顺序不同。我将尝试另一种方法: 让数据访问对象返回它们自己的异步令牌或封装挂起调用的其他对象,而不是来自RPC调用的异步令牌。因此,在DAO中,它看起来像这样,这是非常粗略的代码:
public function deleteThing( id : String ) : DeferredResponse {
var deferredResponse : DeferredResponse = new DeferredResponse();
var asyncToken : AsyncToken = theRemoteObject.deleteThing(id);
var result : Function = function( o : Object ) : void {
deferredResponse.notifyResultListeners(o);
}
var fault : Function = function( o : Object ) : void {
deferredResponse.notifyFaultListeners(o);
}
asyncToken.addResponder(new ClosureResponder(result, fault));
return localAsyncToken;
}
当然,DeferredResponse和ClosureResponder类不存在。您可以使用AsyncToken而不是DeferredResponse来代替自己的发明,但是AsyncToken的公共版本似乎没有任何触发响应程序的方法,因此您可能必须对其进行子类化。ClosureResponder只是IResponder的一个实现,它可以在成功或失败时调用函数
无论如何,上面的代码处理业务的方式是,它调用RPC服务,创建一个封装挂起调用的对象,返回该对象,然后当RPC返回时,调用其中一个闭包结果或错误,并且由于它们仍然像RPC调用时一样引用作用域,它们可以触发挂起的调用/延迟响应上的方法
在命令中,它将如下所示:
public function execute( ) : void {
var deferredResponse : DeferredResponse = dao.deleteThing("3");
deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
deferredResponse.addEventListener(FaultEvent.FAULT, onFault);
}
或者,您可以重复该模式,让execute方法返回自己的延迟响应,当命令从DAO获得的延迟响应被触发时,该延迟响应将被触发
但是。我觉得这并不特别漂亮。通过使用现有的许多应用程序框架中的一个,您可能会做一些更好、更不复杂、更不纠结的事情来或多或少地解决这类问题。我的建议是。我再试试一个主意: 让数据访问对象返回它们自己的异步令牌或封装挂起调用的其他对象,而不是来自RPC调用的异步令牌。因此,在DAO中,它看起来像这样,这是非常粗略的代码:
public function deleteThing( id : String ) : DeferredResponse {
var deferredResponse : DeferredResponse = new DeferredResponse();
var asyncToken : AsyncToken = theRemoteObject.deleteThing(id);
var result : Function = function( o : Object ) : void {
deferredResponse.notifyResultListeners(o);
}
var fault : Function = function( o : Object ) : void {
deferredResponse.notifyFaultListeners(o);
}
asyncToken.addResponder(new ClosureResponder(result, fault));
return localAsyncToken;
}
推迟的答复
当然,ClosureResponder类并不存在。您可以使用AsyncToken而不是DeferredResponse来代替自己的发明,但是AsyncToken的公共版本似乎没有任何触发响应程序的方法,因此您可能必须对其进行子类化。ClosureResponder只是IResponder的一个实现,它可以在成功或失败时调用函数
无论如何,上面的代码处理业务的方式是,它调用RPC服务,创建一个封装挂起调用的对象,返回该对象,然后当RPC返回时,调用其中一个闭包结果或错误,并且由于它们仍然像RPC调用时一样引用作用域,它们可以触发挂起的调用/延迟响应上的方法
在命令中,它将如下所示:
public function execute( ) : void {
var deferredResponse : DeferredResponse = dao.deleteThing("3");
deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
deferredResponse.addEventListener(FaultEvent.FAULT, onFault);
}
或者,您可以重复该模式,让execute方法返回自己的延迟响应,当命令从DAO获得的延迟响应被触发时,该延迟响应将被触发
但是。我觉得这并不特别漂亮。通过使用现有的许多应用程序框架中的一个,您可能会做一些更好、更不复杂、更不纠结的事情来或多或少地解决这类问题。我的建议是。AbstractCollection是在Flex/AIR中处理持久对象的最佳方法。GenericDAO提供了答案 DAO是管理执行CRUD操作和其他常见操作的对象 对Java中称为Pojo的ValueObject执行的操作。 GenericDAO是一个可重用的DAO类,可以一般使用。 目标: 在JAVA IBM GenericDAO中,要添加新的DAO,需要执行的步骤很简单, 添加valueobject pojo。 为valueobject添加hbm.xml映射文件。 为DAO添加10行Spring配置文件 类似地,在AS3项目中,swizdao。我们希望取得类似的成就 客户端GenericDAO模型: 在开发客户端语言时,我们还应该为每个valueObject管理一个持久对象集合。 用法: 资料来源:
AbstractCollection是在Flex/AIR中处理持久对象的最佳方法。GenericDAO提供了答案 DAO是管理执行CRUD操作和其他常见操作的对象 对Java中称为Pojo的ValueObject执行的操作。 GenericDAO是一个可重用的DAO类,可以一般使用。 目标: 在JAVA IBM GenericDAO中,要添加新的DAO,需要执行的步骤很简单, 添加valueobject pojo。 为valueobject添加hbm.xml映射文件。 为DAO添加10行Spring配置文件 类似地,在AS3项目中,swizdao。我们希望取得类似的成就 客户端GenericDAO模型: 在开发客户端语言时,我们还应该为每个valueObject管理一个持久对象集合。 用法: 资料来源:
这通常是一个好主意,但在我的例子中,我希望首先在数据访问对象中处理原始RPC结果,然后将这些处理过的结果传递给调用方命令对象,这就是为什么我目前使用AsyncToken来保留对callbaThis的引用,这通常是一个好主意,但在我的例子中,我希望首先在data access对象中处理原始RPC结果,然后将这些处理过的结果传递给调用方command对象,这就是为什么我目前使用AsyncToken来保留对callba的引用