0

我们目前有一些 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?

4

1 回答 1

1

我会做一些类似于 Adob​​e 在制作 IResponder 时所做的事情。

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

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

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

于 2013-03-28T16:45:58.393 回答