代码之家  ›  专栏  ›  技术社区  ›  hasseg

在actionscript 3/flex/air中实现1:1异步回调/事件的最佳方法?

  •  1
  • hasseg  · 技术社区  · 16 年前

    我一直在利用 command pattern 在我的flex项目中,需要以下之间的异步回调路由:

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

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

    目前我已经用 回调函数引用 有特殊的签名,但我想知道 如果有人知道更好的(或替代的)方法?

    下面是一个例子来说明我当前的方法:

    • 我可能有一个视图对象生成一个 DeleteObjectCommand 例如,由于某些用户操作,将引用传递给它自己的两个私有成员函数(一个用于成功,一个用于失败:假设 "deleteObjectSuccessHandler()" "deleteObjectFailureHandler()" 在本例中)作为回调函数引用命令类的构造函数。
    • 然后,命令对象将重复此模式,并将其连接到“数据访问”对象。
    • 当通过网络的RPC成功完成(或失败)时,将首先由“数据访问”对象调用相应的回调函数,然后由命令对象调用,以便最终通过将其 deleteObjectSuccessHandler() deleteObjectFailureHandler() 打电话。
    3 回复  |  直到 14 年前
        1
  •  3
  •   Theo    15 年前

    我再尝试一个想法:

    让您的数据访问对象返回它们自己的异步令牌(或一些封装挂起调用的其他对象),而不是来自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 而不是 延期赔偿 但是公共版本的 异步令牌 似乎没有任何触发响应程序的方法,因此您可能无论如何都必须对其进行子类化。 关闭响应器 只是 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 .

        2
  •  1
  •   Theo    16 年前

    许多flex-rpc类,比如 RemoteObject , HTTPService 等返回 AsyncToken 当你给他们打电话的时候。听起来这就是你想要的。基本上 异步令牌 封装挂起的调用,使注册回调成为可能(形式为 IResponder 实例)到特定调用。

    在情况下 HTTP服务 当你打电话 send() 异步令牌 返回,您可以使用此对象跟踪特定调用,与 ResultEvent.RESULT ,无论它是哪个调用,都会触发它(而且调用很容易以不同于发送的顺序进入)。

        3
  •  0
  •   nsdevaraj    14 年前

    AbstractCollection是处理flex/air中持久对象的最佳方法。泛型DAO提供了答案。

    DAO是管理执行CRUD操作和其他常见操作的对象 要通过一个ValueObjor(称为Pojo在Java中)进行的操作。 GenericDAO是一个可重用的DAO类,它可以被一般地使用。 目标:

    在Java IBM GANKICDAO中,要添加一个新的DAO,要做的步骤很简单, 添加ValueObject(POJO)。 为ValueObject添加hbm.xml映射文件。 为DAO添加10行弹簧配置文件。

    同样,在AS3项目中,Swiz-Dao。我们希望取得类似的成就。

    客户端泛型DAO模型: 当我们在使用客户端语言时,还应该管理一个持久对象集合(针对每个ValueObject)。 用途: 来源: http://github.com/nsdevaraj/SwizDAO

    推荐文章