在ActionScript 3 / Flex / AIR中实现1:1异步回调/事件的最佳方法?

时间:2020-03-05 18:50:23  来源:igfitidea点击:

我一直在Flex项目中利用命令模式,并在以下之间需要异步回调路由:

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

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

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

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

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

解决方案

回答

调用RemoteObjectHTTPService等许多Flex RPC类时,它们都将返回AsyncToken。听起来这就是我们所追求的。基本上," AsyncToken"封装了待处理的调用,从而可以将回调(以" IResponder"实例的形式)注册到特定的调用。

在使用HTTPService的情况下,当我们调用send()时,会返回AsyncToken,并且我们可以使用该对象来跟踪特定的调用,而与ResultEvent.RESULT不同,无论调用哪个都将触发确实如此(呼叫可以很容易地以不同于发送的顺序发出)。

回答

我会再尝试一个想法:

让数据访问对象返回自己的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返回时,调用闭包"结果"或者"故障"之一。 ,并且由于它们仍然具有对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操作和其他Common的对象
要对ValueObject(在Java中称为Pojo)进行的操作。
GenericDAO是可通用的DAO类。
目标:

在JAVA IBM GenericDAO中,要添加新的DAO,要做的步骤很简单,
添加一个valueobject(pojo)。
为valueobject添加一个hbm.xml映射文件。
为DAO添加10行的Spring配置文件。

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

客户端GenericDAO模型:
当我们在使用客户端语言时,我们还应该管理一个持久对象Collection(对于每个valueObject)。
用法:
来源:
http://github.com/nsdevaraj/SwizDAO