管理Flex和Javascript之间的监视式回调

Managing monitoring-style callbacks between Flex and Javascript

本文关键字:监视 回调 之间 Flex Javascript 管理      更新时间:2023-09-26

我们目前有一些Javascript代码依赖于Flex通过ExternalInterface回调来完成一些繁重的工作。这不是世界上最漂亮的东西,但它有效。在Flex端,我们这样定义(remoteCall是一个具有典型RemoteObject行为的包装器):

ExternalInterface.addCallback("doOperation",
    function(data:String, windowId:String):void { doOperation(data, windowId) });
private function doOperation(data:String, windowId:String):void {
    remoteService.remoteCall(data, function(e:ResultEvent):void {
        ExternalInterface.call("doOperationComplete", windowId, e.result);
    });
}

Javascript端是:

function doOperationComplete(windowId, result) {
    var win = windowHandles[windowId];
    win.handleResult(result);
}

这对于我们的大多数用例都很好,但是我要实现一些基本的任务监视,我希望有更好的方法。如果我从上面的相同路径开始,我最终会得到一个场景,其中有一个JS -> Flex调用来获取任务状态。该调用返回void,当该调用完成时,有一个Flex -> JS调用来给JS任务状态。然后JS需要查看状态并采取一些行动:放弃,对结果做一些事情,在延迟后再次检查状态(另一个JS -> Flex, Flex -> JS循环)。

我还没有开始编写这个代码,但看起来它很快就会变得非常复杂,包括管理多个任务,将Flex调用与原始回调相关联,传递适当作用域的数据等。

有好的替代方案吗?某种Javascript任务插件,是专为这种回调场景?是我忽略的设计模式吗?甚至一些有问题的技术,如同步远程服务调用,使doOperation返回任务状态而不是void?

我会像Adobe做IResponder那样做。

创建一个对象,当你使每个调用负责处理调用,并有一个"点"的其他数据,你想与特定的调用相关联(如IResponder中的AsyncToken)。该对象应该在往返结束时调度一个事件,并且您可以使用该事件来获取对"点"或具有该点的对象的引用。

我在纯Flash中这样做是为了使处理数据读/写更干净一点。我将Loader包装在另一个类中,该类会记住调用的信息,并在调用完成时生成一个COMPLETE事件。当我得到COMPLETE事件时,我从包装器中读取相关信息并处理整个事件。

我的回忆是,这与RemoteObject和HTTPService代码的工作方式不同,但在思想过程中是相似的。您可以使用F3转到其中一个或另一个的源代码,看看Adobe是如何处理它的,并尝试在您自己的任务中遵循模式。