原文作者:Brian Riggs
译者: Dreamer
如果你没有看过 Sho Kuwamoto的关于异步事件的一系列日志(译注, 这些日志我都翻译了,可以到我 Blog上查看)的话,我强烈推荐你看。任何 Flex 开发者在创建远程调用的应用程 序的时候最终都会遇到如何最优化代码结构的问题。 在开发NoteTag的时候,我们尝试了很多“异步问题”的解决方案。坏消息是:没有一个万能的解决方案。好消息是:有一些有用的经验可以引导你选择适合你的解决方案。
我会用一个可以对检索 Atom服务文档提供支持的类作为例子,来讲述我们正在尝试解决的具体问题。(在Atom Publishing Protocol的解释中,一个服务文档就是一个日志索引,它可以来自于 blog服务器上的一个特定账户。)
问题 #1:异步调用不会立即返回,而你常常需要传输调用结果。
方案#1:创建一个结果处理器方法,并把它作为一个事件监听器添加到发出异步调用的对象中。
这是最简单的问题,所以相应地,有一个简单的解决方案。(为了使这个简单的例子尽量简单,我省略了错误监听器)。需要指出的一点:我们不需要移除这个 HTTPService事件监听器,因为我们是创建了一个新的实例然后就“扔掉了” 。但是并不会总是出现这种情况……
问题#2:异步调用是使用一个对象来声明的,而这个对象可以在程序中多个地方调用。(想象一下我们的程序为所有的远程调用都重用一个HTTPService实例)。
方案#2:对每个事件的注册,必须有一个对应的“移除” 。如果产生事件的对象(在下面的例子中,是HTTPService)在别的地方被调用的话,移除事件监听器失败会导致它被再次调用。
问题#3:一个方法在返回之前需要执行多个异步调用。让我们把这个用例弄得更复杂一点:我们现在使用已经实现的 AtomPublishingProtocol 来返回服务文档中列出的第一个种子。
方案#3a: 手动把这些调用连接在一起。
正如你看到的,手动地来处理事件监听器的注册和移除是件很痛苦的事。一个可以为我们管理事件注册的帮助类将会简化我们的代码。
方案#3b:使用一个帮助类(e.g. AsyncResponder来管理事件注册。由于空间原因,我没有写出帮助类的源代码,但是你可以在Connections library,或者在 NoteTag中找到)。
这一系列的方法可以很好地工作,并且有很高的易读性。(NoteTag在很多地方使用了这种方法,显式地使用了 AsyncResponder 并间接使用了 ChainedCommand类。ChainedCommand类是在Cairngorm Commands 中使用 AsyncResponder 来把异步方法调用连接起来的一个类)。
在下一篇文章中,我会为这个问题添加另外一种情况:如果在异步方法链中的一个方法需要访问方法链中生成时间较早的数据呢?
出处:Dreamer's Blog
转载时必须以链接形式注明出处及本声明!
牛C网推荐您再看看以下日志:
HTML表格标记教程(15) - 表格的标题
JavaScript教程 - 对象方法的使用
HTML表格标记教程(14) - 表格的表头
HTML表格标记教程(16) - 标题水平对齐属性ALIGN
XML教程 - XML产生背景
JavaScript教程 - JavaScript程序运行环境
HTML表格标记教程(32) - 单元格的水平对齐属性ALIGN
HTML表格标记教程(13) - 内部边框样式属性RULES
HTML表格标记教程(20) - 行的背景色属性BGCOLOR
HTML表格标记教程(15) - 表格的标题
JavaScript教程 - 对象方法的使用
HTML表格标记教程(14) - 表格的表头
HTML表格标记教程(16) - 标题水平对齐属性ALIGN
XML教程 - XML产生背景
JavaScript教程 - JavaScript程序运行环境
HTML表格标记教程(32) - 单元格的水平对齐属性ALIGN
HTML表格标记教程(13) - 内部边框样式属性RULES
HTML表格标记教程(20) - 行的背景色属性BGCOLOR
ActionScript处理异步事件(三)
异步教程(二)





