1

好吧,我想我最好在开始扯头发之前先问问别人。我一直在从 xml 文件中加载数据,其想法是,如果在加载 xml 之后调用 loadDetails,它将在此基础上加载它们,并且如果在它设置一个标志之前调用它,它将告诉对象xml完成​​后自动再次调用它。很简单,对吧?

private function parseXML(e:Event):void
{
    trace("parseXML " + mLevelID.toString(16) + "   " + mAutoload);
    var xml:XML = new XML(e.target.data);
    // do stuff...
    System.disposeXML(xml);
    mDetailsReady = true;
    if (mAutoload)
        loadDetails();
}

private function cancelXML(e:Event):void
{
    trace("cancelXML " + mLevelID.toString(16));
    mAutoload = false;
}

public function loadDetails():void
{
    if (!mDetailsReady)
    {
        if (!mAutoload)
            trace("autoload on " + mLevelID.toString(16));
        mAutoload = true;
        return;
    }
    if (mAutoload) trace("autoloaded " + mLevelID.toString(16));
    // do stuff...
    mAutoload = false;
}

这就是问题所在。它没有调用 loadDetails,即使在正确设置了标志之后......或者并非总是如此。这是一些示例输出:

autoload on 0
autoload on a
autoload on 1
cancelXML 1
parseXML 0   true
autoloaded 0
parseXML a   false

如您所见,它跟踪所有三个级别中的 mAutoload 设置。但是,当需要实际解析 a 级中的 xml 时,它会将 mAutoload 查询为 false 并且无法自动加载——而且,不,它不会同时在另一个函数中设置为 false,唯一的另一个函数将 mAutoload 设置为 false 是构造函数。

我真的很困惑和沮丧。我想我愿意接受这只是 AS3 的荒谬,并愿意接受有关如何绕过问题的建议,但现在我只是非常沮丧。任何反馈表示赞赏。

4

1 回答 1

0

你的逻辑不对

在方法 parseXML 你做

mDetailsReady = true;
if (mAutoload)
    loadDetails();

这意味着 mAutoload 是 true 并且 mDetailsReady 是 true

但在 loadDetails 方法中

if (!mDetailsReady)
{
    if (!mAutoload)

我不确定你想用这个类实现什么,但如果你正在编写某种 xml 加载器类,你可能想要使用更多的 Loader 类变量来确定它是否完成加载,而不是你自己跟踪它。

于 2013-02-15T17:09:37.353 回答