【问题标题】:AS3 Event Race ConditionAS3 赛事竞赛条件
【发布时间】:2012-07-12 23:43:06
【问题描述】:

当我使用一些自定义事件实例化新的 MovieClip 类时,我在解决存在的竞争条件时遇到了一些麻烦,这些事件在我可以将实例存储在关联对象中之前会回火。

主类

var pages:Object = {
    "page1":"page1",
    "page2":"page2"
};

for(var pageName:String in pages)
{
    pages[pageName] = buildPage(pageName, onReady);
}

function buildPage(pageName:String, onReady:Function)
{
    var newPage:MovieClip = new (getDefinitionByName(pageClass) as Class)();
    newPage.addEventListener("PAGE_READY", onReady);
    newPage.dispatchEvent(new Event("PAGE_CREATE"));
    return newPage;
}

function onReady(e:Event)
{
    for(var pageName:String in pages)
    {
        trace(typeof pages[pageName]);
    }
}

页面 1 和 2 类扩展了 MovieClip

function pageX()
{
    this.addEventListener("PAGE_CREATE",this.onCreate);
}

function onCreate(e:Event)
{
    this.graphics.beginFill(0xFF0000);
    this.graphics.drawRect(0,0,200x200);
    this.graphics.endFill();

    this.dispatchEvent(new Event("PAGE_READY"));
}

不幸的是,当这一切都发生时,我明白了:

string
string
object
string

在我可以存储 MovieClip 实例以供以后参考之前,原始字符串对象仍然存在。关于如何打败这个有什么建议吗?

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    您发布的代码未描述标准类。
    此代码是在影片剪辑帧上还是在单独的文件中?
    但就发布的代码而言,我可以看到您的问题是在将对象添加到数组之前触发 PAGE_CREATE 事件。
    你在做什么

    newPage.dispatchEvent(new Event("PAGE_CREATE"));
    

    在您返回对象之前。
    您没有发布完整的类,所以我真的无法帮助您重写代码,但是,从您发布的内容中,我将完全删除 buildPage 方法并将代码置于循环中,然后在将对象添加到数组后调度事件.
    另外,另一个原因是,如果该函数中没有很多代码,则最好不要从循环中调用该函数。

    for(var pageName:String in pages)
    {
        var newPage:MovieClip = new (getDefinitionByName(pageClass) as Class)();
        newPage.addEventListener("PAGE_READY", onReady);
        pages[pageName] = newPage;
        newPage.dispatchEvent(new Event("PAGE_CREATE"));
    }
    

    【讨论】:

    • 我只发布了与情况相关的课程块,而不是整个课程,并且我已经转移到与您描述的设置类似的设置。我只是发现它是肮脏的代码,并且很想看看是否有更好的解决方案。感谢您重申我的问题,但我开始认为我疯了。
    • 好吧,就像我说的,如果没有你发布完整的代码,我无法帮助你将类重新设计到更标准的水平。
    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 2022-11-10
    • 2018-04-15
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多