Загрузка XML в ActionScript 3 до того, как произойдет прослушиватель событий - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь заполнить некоторые данные из ленты XML, которую мы создали, в мой Flash-фильм.Основное действие этого в конструкторе для MediaElementJS .as файла.

В любом случае, главная проблема в том, что я продолжаю читать, что нет способа загрузить URL-адрес синхронно в AS3 (которыймне все еще трудно поверить).Этот конструктор вызывает и parse('url'), и функцию addEventListener(EVENT.ADDED_TO_STAGE, initializeAds);

. Теперь объявления нуждаются в информации из XML, но XML еще не готов.Я попытался вызвать объявления в конце синтаксического анализатора XML, когда я знал, что они будут предварительно подготовлены, но это портит их, и значения объявлений никогда не изменяются по сравнению с их значениями по умолчанию..

Так есть ли возможность предварительно загрузить данные с 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);

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Загрузка URL-адресов всегда асинхронная, поэтому добавьте прослушиватель событий в функцию ответа для загрузчика URL-адресов.

Теперь ваш вопрос звучит так, как будто вы пытались это сделать, но у вас возникли проблемы, поэтому опубликуйте этот код и позвольте нам принятьвзгляд.

2 голосов
/ 30 марта 2012

Редактировать START

Когда у меня происходит несколько асинхронных вызовов, и мне нужно что-то произойти после того, как они оба сделаны, я обычно использую логические значения для хранения, если каждый из них уже произошел,затем в третьей функции, которую они оба вызывают, я проверяю оба логических значения.

Вот как я это сделаю:

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
}

Если это не ваша проблема, я думаю, вам нужно предоставитьбольше кода вместо комментариев, которые указывают на другие вещи, потому что это немного неясно.

Например, я не уверен, что вы подразумеваете под "Код в конструкторе работает, если я назначаю динамическистатическое значение, но если я попытаюсь объединить в цепочку события, чтобы получить динамическое значение и динамическое присваивание, оно хрустит ».Кроме того, поскольку нет примера данных или того, что такое rootURL, отсюда невозможно отладить, чтобы понять, что происходит не так.

Поскольку ошибок нет, нам потребуется возможность перекомпилировать некоторую часть вашегоиспользуйте локальный код для улучшения обратной связи.

Edit END

Блокировка или синхронные вызовы - ужасная идея в отношении сетевых коммуникаций из-за недостаточной надежности сетей и/ или серверы.Если внешнее приложение заблокировано для ожидания ответа перед выполнением какой-либо другой обработки, это приведет к ужасному взаимодействию с пользователем, поэтому синхронные удаленные вызовы отсутствуют.

Что происходит с синхронным вызовом, когдасервер взрывается, клиент остается заблокированным, даже если ответ не будет получен, пользователь не сможет взаимодействовать с чем-либо еще во внешнем интерфейсе, потому что он ожидает указанного ответа, который никогда не придет?Гораздо лучше, чтобы удаленные вызовы любого рода выполнялись асинхронно, то же самое относится и к локальному доступу к диску в Java (или иным образом), где использование асинхронных неблокирующих вызовов, как правило, является лучшим способом разрешения других процессов внутриприложение должно продолжаться независимо от состояния или использования на диске.

То, что вы делаете, должно работать нормально, вы делаете вызов удаленной службе, оно отвечает с некоторым результатом и поражает вашего "слушателя"или функцию «обратного вызова», то вы хотите сделать что-то с результатами, вы можете вызвать другую функцию, и данные есть.

Мне кажется, что единственное, что не происходит, это обновления после того, как факт "Это, вероятно, связано с отсутствием привязываемых метаданных / событий для диспетчеризации свойств.Проверяли ли вы результат в возвращаемом событии, ставили ли точки останова в методе, который должен вызываться после возврата данных?То, что вы делаете, вполне возможно, и даже кажется, что у вас все в порядке, но определенно есть что-то, что вы делаете неправильно, в результате чего вы не можете выполнять эту работу.Если вы можете объяснить поведение немного яснее, это поможет, а также то, что вы делаете здесь:

// ЭТО ТАМ, ГДЕ Я ПЫТАЛСЯ НАЗВАТЬ ФУНКЦИЮ, НУЖНУЮ ЗАГРУЗИТЬ ПОЗЖЕ

...