apache-flex - 处理异步控制结构(Fluent Interface?)

标签 apache-flex silverlight asynchronous javafx fluent-interface

我们的 Flex 应用程序的初始化代码正在执行一系列异步调用,以检查用户凭据、加载外部数据、连接到 JMS 主题等。根据应用程序运行的上下文,其中一些调用不会被执行或执行不同的参数。

由于所有这些调用都是异步发生的,因此控制它们的代码很难阅读、理解、维护和测试。对于每个调用,我们需要一些回调机制来决定接下来要执行的调用。

我想知道是否有人尝试过将这些调用包装在可执行单元中并拥有一个可以连接和控制它们的 Fluent Interface (FI)。

从我的脑海中,代码可能看起来像:

var asyncChain:AsyncChain = execute(LoadSystemSettings)
.execute(LoadAppContext)
.if(IsAutologin)
  .execute(AutoLogin)
.else()
  .execute(ShowLoginScreen)
.etc;
asyncChain.execute();

AsyncChain 将是一个执行树,使用 FI 构建(当然我们也可以构建一个没有 FI 的树)。

对于在 Flash Player、Silverlight、JavaFX 等单线程模型中运行的环境,这可能是一个有趣的想法?...

在我深入研究代码尝试之前,我希望能得到一些反馈。

2010 年 3 月 19 日更新 :我们在 Spring ActionScript 项目中创建了一个实验性的 Task API,提供对异步进程的控制。我们很乐意得到反馈。 http://www.springactionscript.org/docs/reference/html/the_operation_api.html#tasks

最佳答案

我做过类似的事情,专门用于应用程序的初始化。但是,由于我们使用 Flex 开发大多数 Flash 应用程序,因此我在编写它时考虑了 MXML 的使用。

语法看起来就像声明一个数组(我只是在编造标签,但你明白了):

<Initialize>
    <DisplayPreloader />
    <LoadConfiguration id="configurationLoader" source="foo.xml" />
    <ParseConfiguration source="{configurationLoader.result}" />

    <!-- ... --->
</Initialize>

使用诸如 IMXMLObject 之类的接口(interface),只需将其放入应用程序中就可以很好地工作,嘿,这就是您的初始化代码。当然,这不一定是为了初始化,它可以应用于任何地方。

值得注意的优点:
  • 执行顺序直观且易于更改(只需向上或向下移动标签)
  • 列表中的步骤并不真正关心其他步骤
  • 可以使用绑定(bind)语法在步骤之间传递数据,促进依赖注入(inject)
  • 正确封装的单任务步骤可以很容易地重复使用

  • 显着缺点:
  • MXML == angle bracket tax
  • 如果多次触发,使用绑定(bind)传递数据可能会导致意外结果
  • 应注意遵守 Single Responsibility Principle 的步骤。 ,否则它很容易变得过于复杂
  • 关于apache-flex - 处理异步控制结构(Fluent Interface?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/945666/

    相关文章:

    c# - Silverlight 和一个表单应用程序

    javascript - Vuex:Axios GET 请求在组件内部返回未定义

    apache-flex - flex monkium 与 selenium ide 的集成

    apache-flex - FLEX Stage 3D 中的像素大小

    java - Flex AMF Remoting 请求到 Java 服务器的排队策略

    c# - 为什么我的 InnerException 没有发送给客户端?

    c# - 导出 Silverlight 动画

    C# - 接口(interface)的可选异步

    php - Facebook 注册插件 - 异步验证(电子邮件)

    apache-flex - 处理客户事件的flexunit和Async.asyncHandler()