我一直在利用 命令模式 在我的 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;
}

DeferredResponseClosureResponder 当然,类并不存在。您可以使用而不是发明自己的 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top