【问题标题】:Loading an XML in ActionScript 3 before an event listener happens在事件侦听器发生之前在 ActionScript 3 中加载 XML
【发布时间】:2012-03-30 17:52:25
【问题描述】:

我正在尝试将我们制作的 xml 提要中的一些数据填充到我的 Flash 电影中。这个的主要动作是在MediaElementJS's.as 文件的构造函数中。

无论如何,主要问题是我一直在阅读没有办法在 AS3 中同步加载 URL(我仍然很难相信)。此构造函数同时调用parse('url') 和函数addEventListener(EVENT.ADDED_TO_STAGE, initializeAds);

现在广告需要来自 XML 的信息,但 XML 尚未准备好。当我知道它会被准备好时,我试图在 XML 解析器的末尾调用广告,但它把它们弄乱了,并且广告值永远不会改变它们的默认值..

哦,你为什么要使用 actionscript 锁定机制..

那么是否有从 URL 预加载数据的方法?

代码:

    public function LoadXML(e:Event):void 
    {
        removeEventListener(Event.COMPLETE, LoadXML);
        var xmlData:XML = new XML(e.target.data);

        episodeData.pre.type    = xmlData.episode.pre.ad.@type;
        episodeData.pre.url     = xmlData.episode.pre.ad.text();

        episodeData.video       = Number(xmlData.episode.video.@id);    /*************** I CAN'T REMEMBER ***********/
        episodeData.pageTitle   = xmlData.episode.video.@pagetitle;
        episodeData.title       = xmlData.episode.video.@title;
        episodeData.source      = xmlData.episode.video.source.text();


        episodeData.post.type=xmlData.episode.post.ad.@type;
        episodeData.post.url=xmlData.episode.post.ad.text();

        episodeData.nextEpisode=xmlData.episode.post.nextepisode.text();    //if not empty redirect to this

        xmlLoading = false;
//THIS IS WHERE I TRIED TO CALL THE FUNCTION I NEED TO LOAD LATER
    }

    public function parse()
    {

        var xmlLoader:URLLoader = new URLLoader(); 
        //var xmlData:XML = new XML(); 
        xmlLoader.load(new URLRequest(rootURL + '/episode.aspx?associd=' + _episode)); 
        //xmlLoader.addEventListener(Event.COMPLETE, processXML);
        xmlLoader.addEventListener(Event.COMPLETE, LoadXML); 
    }

我已经尝试过使用静态 URL 地址等等,但没有骰子。

如果我动态分配静态值,则构造函数中的代码可以工作,但如果我尝试将事件链接在一起以获取动态值和动态分配,它就会崩溃。

在构造函数中,肯定都是自己运行的:

        parse();

        // Google IMA EventListener
        addEventListener(Event.ADDED_TO_STAGE, initialize);

【问题讨论】:

    标签: actionscript-3 events event-handling xml-parsing


    【解决方案1】:

    加载 URL 始终是异步的,因此在 URL 加载器的响应函数中添加事件监听器。

    现在您的问题听起来像是您尝试过但遇到了一些问题,所以发布该代码让我们看看。

    【讨论】:

    • 所以我正在阅读有关检查bytes loaded 和总字节数的能力。我还读到你不能通过循环导致同步。在继续之前真的没有办法检查这些值的完成情况吗?
    【解决方案2】:

    编辑开始

    当我有多个异步调用发生并且在它们都完成后我需要发生一些事情时,我通常使用布尔值来存储每个都发生过的情况,然后在它们都调用的第三个函数中,我检查两个布尔值。

    我会这样做:

    protected function viewnavigatorapplication1_preinitializeHandler(event:FlexEvent):void
    {
        var loader1:Loader = new Loader();
        var loader2:Loader = new Loader();
    
        loader1.addEventListener(Event.COMPLETE, loader1_completeHandler);
        loader1.load(new URLRequest("http://www.whitehouse.gov"));
        loader2.addEventListener(Event.COMPLETE, loader2_completeHandler);
        loader2.load(new URLRequest("http://www.nasa.gov"));
    }
    
    private function loader1_completeHandler():void
    {
        loader1Done = true;
    
        //Maybe do some stuff here
    
        moveOn();
    }
    private function loader2_completeHandler():void
    {
        loader2Done=true;
    
        //Maybe do some stuff here
    
        moveOn();
    }
    
    
    private function moveOn():void
    {
        if(!loader1Done||!loader2Done)
            return;
    
        //Do whatever needs to be done once both asynchronous events have completed
    }
    

    如果这不是您的问题,我认为您需要提供更多代码来代替指示其他事情发生的 cmets,因为这有点不清楚。

    例如,我不确定您所说的“如果我动态分配静态值,则构造函数中的代码可以工作,但是如果我尝试将事件链接在一起以获得动态值和动态分配,它就会崩溃。”此外,由于没有数据示例或 rootURL 是什么,因此无法从这里调试以了解发生了什么问题。

    由于没有错误,我们需要能够在本地重新编译您的部分代码以提供更好的反馈。

    编辑END

    由于网络和/或服务器缺乏可靠性,阻塞或同步调用对于网络通信来说是一个可怕的想法。如果前端应用程序在执行任何其他处理之前被锁定以等待响应,这将导致糟糕的用户体验,这就是没有同步远程调用的原因。

    当服务器崩溃时,同步调用会发生什么情况,即使没有响应,客户端仍保持锁定状态,用户无法与前端中的其他任何东西进行交互,因为它正在等待永远不会出现的响应?以异步方式完成任何类型的远程调用要好得多,Java(或其他)中的本地磁盘访问也是如此,其中使用异步非阻塞调用通常是允许其他进程的更好方法无论磁盘上的状态或使用情况如何,应用程序都会继续运行。

    您正在做的事情应该可以正常工作,您调用远程服务,它会响应一些结果并点击您的“侦听器”或“回调”函数,然后您想对可以调用的结果做一些事情另一个函数,数据就在那里。

    在我看来,唯一没有发生的事情是更新后没有反映在 UI 中,这可能是由于缺少属性的可绑定元数据/事件调度。您是否在返回的事件中检查了结果,是否在数据返回后要调用的方法中放置了断点?你正在做的事情是完全可能的,甚至看起来你大部分都是对的,但肯定有你做错的事情导致你无法完成这项工作。如果你能更清楚地解释这种行为会有所帮助,那么你在这里做什么:

    //这是我尝试调用稍后需要加载的函数的地方

    【讨论】:

    • tbh 我意识到这是正确的加载方式,这就是语言发生这种变化的原因。 A.)我仍然想知道是否有任何可能的方法来强制它同步......然后 B.)我认为我对实际问题有某种事件侦听器范围问题。似乎人们经常遇到它,但我不知道它是什么。关于在构造函数中设置事件侦听的动态,您对 AS3 的怪癖有什么要借鉴的吗?
    • 是的,你说得对,我回答的问题被包含在关于异步的部分中......我正在编辑上面的答案,以添加解决上述问题的解决方案......对不起
    • 好的,我尝试根据您所说的拼凑出来的内容来更新我的答案,但是如果没有我在上面发布的内容中描述的某些部分,我无法真正测试您的代码。如果我有 rootURL,并且当您“将事件链接在一起以获得动态值和动态分配”时,我可以看到您在做什么,那么我可能会提供帮助,但没有更多信息,我只是在猜测。
    • 抱歉,shaunhusain,由于文案问题,我无法发布所有代码。 ;/
    • Sooo,我的“重要”事件是什么样的:addEventListener(Event.ADDED_TO_STAGE, initialize); 我试图在 initialize() 中加载我的 xml,然后在 xml 回调结束时继续初始化。我认为这肯定会起作用,但我想我正在连接的组件都相当敏感。你是说你都调用了这个函数,但它只有在两者都加载的情况下才有效?这很聪明;p
    猜你喜欢
    • 2011-10-03
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多