什么导致Flash/ActionScript运行时错误“WatcherSetupUtil未定义”?

6

我正在开发一个Flex应用程序(“MyApp”),但是在使用过程中遇到了一些非常奇怪和不一致的错误。其中一个错误有时会在应用程序启动后立即出现:

"Variable _MyAppWatcherSetupUtil is not defined."

完整的错误输出在问题底部。
这个错误特别奇怪的地方是,我在进行项目构建后(即运行swf很多次并且总是发生),立即且一致地得到它,而使错误消失(我不会说“修复它”)的唯一方法是再次构建项目。
有人知道这个错误是关于什么的吗?到目前为止,我能够收集到的最好信息是它可能与绑定变量有关(这就是WatcherUtil所暗示的),但我不明白为什么在构建之间会不一致。
使用flex_sdk_4.5.0.20967中的mxmlc进行编译。
最近发生错误的完整输出:
异常抛出:ReferenceError: Error #1065: 变量_MyAppWatcherSetupUtil未定义。 at global/flash.utils::getDefinitionByName() at MyApp()[C:\code\Sandbox\MyApp\src\MyApp.mxml:6] at _MyApp_mx_managers_SystemManager/create()[_MyApp_mx_managers_SystemManager.as:50] at mx.managers.systemClasses::ChildManager/initializeTopLevelWindow()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\systemClasses\ChildManager.as:311] at mx.managers::SystemManager/initializeTopLevelWindow()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\SystemManager.as:3063] at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::kickOff()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\SystemManager.as:2849] at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::preloader_completeHandler()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\SystemManager.as:2729] at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at mx.preloaders::Preloader/timerHandler()[E:\dev\hero_private\frameworks\projects\framework\src\mx\preloaders\Preloader.as:542] at flash.utils::Timer/_timerDispatch() at flash.utils::Timer/tick()
按照J_A_X的要求更新:
MXML文件的前7行是:
<?xml version="1.0" encoding="utf-8"?>
<s:Application height="100%" width="100%"
               xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               initialize="InitData();">
<fx:Script source="MyApp.as"/>

而InitData()代码(以及其他相关的脚本行)都在MyApp.as文件中:

import classes.RpcServerProxy;
public var SP:RpcServerProxy;

public function InitData():void {
    SP = new RpcServerProxy("http://192.168.1.102:1234");
}

1
我猜测你的代码中有些东西导致了这个问题,但奇怪的是堆栈跟踪中没有自定义组件。 WatchterUtils确实与绑定相关。 - JeffryHouser
我在项目中有一个自定义(且复杂)的纯ActionScript类,但我没有将其中任何内容绑定。感谢您确认了绑定关系。对我来说最大的谜团是构建之间的不一致性,这使得解决问题变得棘手。 - Russ
如果这是一个纯 ActionScript 项目,你为什么要打上 Flex 的标签呢?你是否在使用 Flex 组件? - JeffryHouser
很抱歉因提到纯AS类而混淆了问题......它绝对是一款Flex应用程序。只是我在其中使用了一个强大的ActionScript类,它在后台处理大部分工作(RPC调用),因此我有点怀疑它。虽然像我所说的那样......没有任何可绑定的内容。所有数据交换均通过AsyncTokens进行。这可能与问题无关。 - Russ
@The_asMan - 我其实没有任何内容可以展示在 E 盘中。我看到了那个奇怪的引用,觉得可能有一些内部魔法正在发生。 - Russ
显示剩余6条评论
1个回答

4
我不知道 RpcServerProxy 是什么,但它可能在一切实例化之前做了些事情。不要在initialize事件中调用函数,而应该使用creationComplete代替。
你可能总是想查看该类中的代码,因为它肯定做了一些奇怪的事情。

是的,RpcServerProxy肯定在做很多有趣的事情:)。首先,它是一个动态代理类...“public dynamic class RpcServerProxy extends Proxy”。还有更多的复杂性。这可能是相关的,但无论如何,我认为我不应该看到相同代码库的构建之间的变化!我会研究一下initialize事件和creationComplete之间的时间差异。谢谢! - Russ
1
谢谢!从“initialize”切换到“creationComplete”不仅似乎解决了这个问题,还完全解决了我之前遇到的“堆栈下溢”问题(并发布了相关帖子)!我不确定为什么,但这确实让我认为Flash初始化代码/时间有点不稳定。现在我会坚持使用“creationComplete”进行初始化。 - Russ
你应该了解组件生命周期以及事件何时被分发。这对于知道什么在何时做什么非常重要。初始化意味着并非所有内容都已创建/可用。 - J_A_X
阅读了相关资料后,似乎applicationComplete是更好的初始化事件,适用于这种类型的事情。请参见此博客文章进行解释,以及此视频(大约在4:25处)作为Adobe技术布道师使用它的示例。 - Russ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接