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

时间:2013-03-28 14:20:58

标签: javascript flex design-patterns

我们目前有一些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与原始回调相关联,传递适当范围的数据等等。

有没有好的选择?某种为这种回调场景设计的Javascript任务插件?我忽略了一些设计模式?甚至一些可疑的技术,如同步远程服务调用,以便doOperation返回任务状态而不是void?

1 个答案:

答案 0 :(得分:1)

我只是做Adobe在制作IResponder时所做的事情。

当您进行负责处理呼叫的每个呼叫时创建一个对象,并且对于您要与特定呼叫关联的其他数据(如IResponder中的AsyncToken)具有“点”。当往返完成时,该对象将发送一个事件,您可以使用该事件来获取对“点”或具有该点的对象的引用。

我在纯Flash中完成了这项工作,使处理数据读/写更清晰。我将Loader包装在另一个Class中,它记住有关该调用的信息,并在调用完成时生成一个COMPLETE事件。当我收到COMPLETE事件时,我从包装器中读取相关信息并处理整个事件。

我的回忆是,这与RemoteObject和HTTPService代码的工作方式不同,但在思考过程中类似。您可以使用F3转到其中一个的源代码,并确切了解Adobe如何处理它,并尝试按照您自己的任务的模式。