在 ActionScript 3 / Flex / AIR 中实现 1:1 异步回调/事件的最佳方法?
-
09-06-2019 - |
题
我一直在利用 命令模式 在我的 Flex 项目中,以下之间需要异步回调路由:
- 无论谁实例化了给定的命令对象和命令对象,
- 命令对象和“数据访问”对象(即处理命令对象调用的通过网络到服务器的远程过程调用的人。
这两个回调路由中的每一个都必须能够是一对一的关系。这是因为我可能有给定命令类的多个实例同时运行完全相同的作业,但参数略有不同,并且我不希望它们的回调混淆。使用事件(AS3 中处理异步性的默认方式)已经过时了,因为它们本质上基于一对多关系。
目前我已经使用这样做了 回调函数参考 具有特定类型的签名,但我想知道 如果有人知道更好(或替代)的方法?
这是一个例子来说明我当前的方法:
- 我可能有一个生成一个视图对象
DeleteObjectCommand
实例由于某些用户操作,将引用传递给它自己的两个私有成员函数(一个表示成功,一个表示失败:比方说"deleteObjectSuccessHandler()"
和"deleteObjectFailureHandler()"
在此示例中)作为回调函数对命令类构造函数的引用。 - 然后命令对象将通过其与“数据访问”对象的连接重复此模式。
- 当网络上的 RPC 成功完成(或失败)时,首先由“数据访问”对象调用适当的回调函数,然后由命令对象调用,以便最终在第一个实例化操作的视图对象地点通过其获得通知
deleteObjectSuccessHandler()
或者deleteObjectFailureHandler()
叫。
解决方案
我会再尝试一个想法:
让您的数据访问对象返回它们自己的 AsyncToken(或封装待处理调用的一些其他对象),而不是来自 RPC 调用的 AsyncToken。因此,在 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 返回时,其中一个闭包 result
或者 fault
被调用,并且由于它们仍然具有对 RPC 调用时的作用域的引用,因此它们可以触发挂起的调用/延迟响应上的方法。
在命令中它看起来像这样:
public function execute( ) : void {
var deferredResponse : DeferredResponse = dao.deleteThing("3");
deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
deferredResponse.addEventListener(FaultEvent.FAULT, onFault);
}
或者,您可以重复该模式,使 execute
方法返回一个自己的延迟响应,当命令从 DAO 获取的延迟响应被触发时,该延迟响应将被触发。
但。我认为这不是特别漂亮。通过使用现有的许多应用程序框架之一来或多或少地解决此类问题,您可能可以做一些更好、更简单、更少纠缠的事情。我的建议是 伴侣.
其他提示
许多 Flex RPC 类,例如 RemoteObject
, HTTPService
, , ETC。返回 AsyncToken
当你打电话给他们时。听起来这就是你所追求的。基本上是 AsyncToken
封装挂起的调用,使得注册回调成为可能(以 IResponder
实例)到特定的调用。
如果是 HTTPService
, , 你打电话时 send()
一个 AsyncToken
返回,您可以使用该对象来跟踪特定的调用,这与 ResultEvent.RESULT
, ,无论是哪个呼叫,都会触发该呼叫(并且呼叫很容易以与发送时不同的顺序进入)。
AbstractCollection 是在 Flex / AIR 中处理持久对象的最佳方式。GenericDAO 提供了答案。
DAO是设法执行CRUD操作和其他常见操作的对象,该对象是通过ValueObject(称为Java中的Pojo)进行的。GenericDAO 是一个可重用的 DAO 类,可以通用地使用。目标:
在Java IBM Genericdao中,要添加一个新的DAO,要执行的步骤简单地添加了ValueObject(POJO)。为 valueobject 添加 hbm.xml 映射文件。为 DAO 添加 10 行 Spring 配置文件。
同样,在 AS3 Project Swiz DAO 中。我们希望取得类似的成就。
客户端 GenericDAO 模型:当我们开发客户端语言时,我们还应该管理一个持久对象集合(对于每个 valueObject)。用法:来源:http://github.com/nsdevaraj/SwizDAO