1

我一直在我的 Flex 项目中使用命令模式,需要异步回调路由:

  • 实例化给定命令对象和命令对象的人,
  • 命令对象和命令对象调用的“数据访问”对象(即通过网络处理对服务器的远程过程调用的人)。

这两个回调路由中的每一个都必须能够是一对一的关系。这是因为我可能有几个给定命令类的实例同时运行完全相同的作业,但参数略有不同,我不希望它们的回调混淆。因此,使用事件(AS3 中处理异步的默认方式)几乎已被淘汰,因为它们本质上是基于一对多关系的。

目前我已经使用具有特定类型签名的回调函数引用来完成此操作,但我想知道是否有人知道更好(或替代)的方法?

这是一个示例来说明我当前的方法:

  • 我可能有一个视图对象,该对象由于某些用户操作而产生一个DeleteObjectCommand实例,将引用传递给它自己的两个私有成员函数(一个代表成功,一个代表失败:假设在这个例子"deleteObjectSuccessHandler()""deleteObjectFailureHandler()")作为对命令类的回调函数引用构造函数。
  • 然后命令对象将重复此模式,并连接到“数据访问”对象。
  • 当网络上的 RPC 成功完成(或失败)时,会调用相应的回调函数,首先是“数据访问”对象,然后是命令对象,以便最终实例化操作的视图对象在第一个地点通过其deleteObjectSuccessHandler()或被deleteObjectFailureHandler()调用而得到通知。
4

3 回答 3

3

我再尝试一个想法:

让您的数据访问对象返回它们自己的 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 获得的延迟响应时,该响应将被触发。

但。我觉得这不是特别漂亮。通过使用现有的许多应用程序框架之一来或多或少准确地解决此类问题,您可能会做一些更好、不那么复杂和不那么纠结的事情。我的建议是Mate

于 2008-09-10T12:06:00.653 回答
1

许多 Flex RPC 类,如RemoteObject、等,在您调用它们时会HTTPService返回s。AsyncToken听起来这就是你所追求的。基本上AsyncToken封装了挂起的调用,从而可以将回调(以IResponder实例的形式)注册到特定的调用。

在 的情况下HTTPService,当您调用send()an时AsyncToken,您可以使用此对象来跟踪特定调用,ResultEvent.RESULT这与发送)。

于 2008-09-10T10:18:13.923 回答
0

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

于 2010-05-13T05:25:35.550 回答