Flex应用程序的初始化代码正在执行一系列异步调用以检查用户凭据,加载外部数据,连接到JMS主题等。根据应用程序运行的上下文,其中一些调用不会执行或用不同的参数执行。
由于所有这些调用都是异步发生的,因此控制它们的代码很难阅读,理解,维护和测试。对于每个调用,我们需要一些回调机制,我们在其中决定下一步执行什么调用。
我想知道是否有人尝试将这些调用包装在可执行单元中并使用可以连接和控制它们的Fluent接口(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等单线程模型中运行的环境,这可能是个有趣的想法......
在深入研究代码尝试之前,我希望得到一些反馈。
更新19/03/2010 :我们在Spring ActionScript项目中创建了一个实验性Task API,可以控制异步进程。我们很乐意收到反馈。 http://www.springactionscript.org/docs/reference/html/the_operation_api.html#tasks
答案 0 :(得分:2)
我做过类似的事情,专门用于应用程序的初始化。但是,由于我们使用Flex开发了大多数Flash应用程序,因此我在编写MXML时考虑了它。
语法看起来就像声明一个数组(我只是编写标签,但你明白了):
<Initialize>
<DisplayPreloader />
<LoadConfiguration id="configurationLoader" source="foo.xml" />
<ParseConfiguration source="{configurationLoader.result}" />
<!-- ... --->
</Initialize>
使用诸如IMXMLObject之类的接口,它可以很好地将它发送到一个应用程序中,并且嘿presto,这是你的初始化代码。当然,这不一定是初始化,它可以应用于任何地方。
知名专业人士:
值得注意的缺点:
答案 1 :(得分:1)
绝对可以做到这一点。您可以传递动作和延续功能,并威胁它们成为异步调用和回调。这称为Continuation passing style。这需要将常规逻辑转换为函数调用序列。
直截了当的方法是引入一些封装异步调用的monadic框架(like in Haskell)。但是,在将程序逻辑转换为CPS时,仍然需要创建多个函数(回调)。看到: CPS in Haskell。但语法很难看。 Scheme中的语法很好,但这与Scheme计算模型紧密相关:宏和库代码可用于宏处理。
通过一些语言支持,您可以简化语法:例如F#中的计算表达式,正好是async one。引擎盖下与Monad概念相近。
高级事件驱动编程的另一个有趣的想法是在Reactive Extensions for .NET (Rx)中实现的。这个想法非常简单:事件与列表非常类似。不同之处在于您不构造它们(基于推送的集合),而是从它们获得下一个元素(基于拉取的集合)。相应地反转接口:代替IEnumerator中的MoveNext和Current,您将在IObservable中获得OnNext,OnDone和OnError。然后,结合现有的observable,你可以得到一些接近你建议的代码。
答案 2 :(得分:1)
如果要使用Flex并深入了解异步调用的流程,我会使用archectural框架Mate。正如Api所说:'Mate的一个基本部分是EventMap标记,它允许您为应用程序创建的事件定义映射。它基本上是IActionList块的列表,其中每个块匹配一个事件类型[..]“现在在每个EventMap中,你可以有几个逻辑上相互连接的异步服务器调用。整个事情是基于mxml标签,所以也是很容易阅读。
答案 3 :(得分:0)
因为你的函数必须是异步的,你不能让它们阻塞等待下一个动作,所以他们所做的就是将一些代码藏在稍后会执行的结构中。
听起来很熟悉吗?简而言之,您正在编译语言并执行VM。没有错,但用正确的语言思考会让你搜索正确的文献。例如,不要与你的内部结构作斗争,以便.else()
部分知道它所配对的.if()
,只需编写一个完整的解析器并在程序中发送一个字符串。
还有很多关于编写简单虚拟机的例子
答案 4 :(得分:0)
这很多都是关于这种编程的非常有趣的讨论。它也是我们最常用语言中最薄弱的部分,在同步语言中表达异步逻辑非常痛苦。我相信延续是这里的答案,因为我们可以认为同步和程序同步,但很容易模拟异步程序控制流程。同步编程非常容易理解,重用非常简单。异步根本没有。但是,直到世界赶上......唉。
你所建议的看起来很有趣,但我现在已经完成了至少两次此类事情,并且从未对它感到满意。我认为你将很难在运行时评估你的if块。我一直遇到的问题是以干净的方式将数据从一步到另一步。如何在步骤运行之后对可能不存在的值编写if语句。
如果我是你,我会考虑看一下州模式。状态模式在对象中模拟此类行为,并且可以异步执行转换。你可以创建一个Fluent界面来创建你上面的状态。
我现在非常有兴趣听听它是如何发生的,因为我现在正在AIR应用程序中执行此操作,而且我对它很满意。